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
posted @ 2019-07-18 14:56  静_渊  阅读(689)  评论(0编辑  收藏  举报