leetcode 698 集合k划分
集合划分
参考:负雪明烛
(leetcode 698) 给定一个整数数组 nums 和一个正整数 k,找出是否有可能把这个数组分成 k 个非空子集,其总和都相等。
面试的时候面到这一题,大脑一片空白。知道大致的方向,深搜,回溯。但是就是不知道如何下手,练的太少。
class Solution:
def canPartitionKSubsets(self, nums: List[int], k: int) -> bool:
if not nums or len(nums) < k:
return False
sum_ = sum(nums)
div, mod = divmod(sum_,k)
if sum_%k and max(nums)>sum_/k:
# 注意这里的判断条件
return False
# 每个集合的和都是一致的
nums.sort(reverse=True)
target = [div]*k
return self.dfs(nums,k,0,target)
def dfs(self,nums,k,index,target):
# 如果恰好用完了,说明满足条件
if index == len(nums):
return True
num = nums[index]
for i in range(k):
# 保证target最终都是0,即所有数字都到了对的地方
if target[i]>=num:
target[i] -= num
if self.dfs(nums,k,index+1,target):
return True
target[i] += num
# 可以将这个过程看作入栈的过程
return False