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. 重新格式化电话号码

698. 划分为k个相等的子集(Python)

leetcode-168周赛-1296-划分数字为连续数字的集合

集合划分问题:思路与剪枝[回溯]