码迷,mamicode.com
首页 > 其他好文 > 详细

leetcode 698 集合k划分

时间:2019-07-18 15:12:48      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:lse   self   说明   给定一个整数数组   过程   class   tar   eve   这一   

集合划分

参考:负雪明烛

(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划分

标签:lse   self   说明   给定一个整数数组   过程   class   tar   eve   这一   

原文地址:https://www.cnblogs.com/curtisxiao/p/11207352.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!