698. 划分为k个相等的子集
给定一个整数数组 nums 和一个正整数 k,找出是否有可能把这个数组分成 k 个非空子集,其总和都相等。
示例 1:
输入: nums = [4, 3, 2, 3, 5, 2, 1], k = 4
输出: True
说明: 有可能将其分成 4 个子集(5),(1,4),(2,3),(2,3)等于总和。
class Solution(object):
def canPartitionKSubsets(self, nums, k):
target, rem = divmod(sum(nums), k)
if rem: return False
def search(groups):
if not nums: return True
v = nums.pop()
for i, group in enumerate(groups):
if group + v <= target:
groups[i] += v
if search(groups): return True
groups[i] -= v
#group[i] == 0的时候跳出循环,这里保证了在i之后group为0的情况和group[i]的情况一样,不用去试,
#因此在遇到第一个group[i] == 0的时候可以跳出循环
if not group:
break
nums.append(v)
return False
nums.sort()
if nums[-1] > target: return False
while nums and nums[-1] == target:
nums.pop()
k -= 1
return search([0] * k)