https://leetcode.com/problems/partition-to-k-equal-sum-subsets/
给你一组数字阵列nums
和数字k
,如果能把阵列分成k
个不为空的子集且子集内的合相等就回传True
今天的题目在Related Topics提到能用DP也能用Backtracking,不过我想不到DP的解法,所以就用Backtracking来解吧
首先,我们要判断他给的阵列能不能切成每个合相等的子集,所以先出每个子集的合target
,并且要符合下面两个规则:
nums
要能被数字k
整除nums
的最大值不能大於子集的合target
接着就是用回朔法了:
我的想法是一项一项组合出target
把k慢慢消耗掉,所以终止条件是k = 0
再来,组合会有两种状况:
target
,这时候我们继续做下一圈的递回backtracking(0, k-1)
target
,这时候我们判断之後的递回能不能组合出target
,不行的话也别让它占着数字class Solution:
def canPartitionKSubsets(self, nums: List[int], k: int) -> bool:
def backtracking(curr, k):
if k == 0: return True
for i in range(len(nums)):
if used[i]: continue
if curr + nums[i] == target:
# 可以消耗掉1个k
used[i] = True
return backtracking(0, k-1)
elif curr + nums[i] < target:
# 由後续判断能不能组成target
used[i] = True
if backtracking(curr + nums[i], k):
return True
else:
used[i] = False
return False
if sum(nums) % k != 0: return False
target = sum(nums) // k
nums.sort(reverse=True)
if nums[0] > target: return False
used = [False] * len(nums)
# 标注哪些数字用过了
return backtracking(0, k)
今天30天完赛了,Sep LeetCoding Challenge也结束了
虽然很多hard难度的题目都是看着答案打的,不过还能得到完成奖章
这就是LeetCoding Challenge的奖章,谢谢大家
<<: Day 15 JavaScript NodeList vs HTMLCollection
第二天,不废话,继续摸摸摸。 ProtoPie 的 Conceptual model 影片开始解释 ...
在 Day 06 和 Day 07 中,我们认识了 React.js 的两个 Components...
目前全球RPA领头羊 UiPath 的讨论热度越来越高 上周 UiPath 也举办了亚太区企业如何应...
在Excel中subtotal函数既能求和,不但能求平均值,还能计数,求最值等。可以说是非常实用的一...
那麽在先前实作中,我们业已将 WordPress 网站建筑在 AWS 环境中(可以详【Day 05】...