leetcode 698 集合k划分
Posted curtisxiao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
以上是关于leetcode 698 集合k划分的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 698. 划分为k个相等的子集(回溯算法解决)
LeetCode 1624. 两个相同字符之间的最长子字符串 / 698. 划分为k个相等的子集 / 面试题 01.08. 零矩阵 / 1694. 重新格式化电话号码
LeetCode 1624. 两个相同字符之间的最长子字符串 / 698. 划分为k个相等的子集 / 面试题 01.08. 零矩阵 / 1694. 重新格式化电话号码