leetcode698. 划分为k个相等的子集

题目

给定一个整数数组 nums 和一个正整数 k,找出是否有可能把这个数组分成 k 个非空子集,其总和都相等。
示例 1:
输入: nums = [4, 3, 2, 3, 5, 2, 1], k = 4
输出: True
说明: 有可能将其分成 4 个子集(5),(1,4),(2,3),(2,3)等于总和。
注意:
1 <= k <= len(nums) <= 16
0 < nums[i] < 10000

思路

分割等和子集,那就先求和,再平分。如果不能平分,那就直接返回false,否则,问题就变成了判断数组是否存在若干个元素求和正好等于数组和的1/k,那就直接遍历所有的结果,深搜解决.

代码

class Solution:
    def canPartitionKSubsets(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: bool
        """
        length=len(nums)
        sum1= sum(nums)
        target= sum1//k
        if k<=0 or k>length or sum1%k !=0 or max(nums)>target:
            return False
        visited=[0 for i in range(length)]
        return self.dfs(nums,visited,0,k,0,0,target)
    def dfs(self,nums,visited,index,k,cur_sum,cur_num,target):
        if k==1:
            return True
        if cur_sum==target and cur_num>0:
            return self.dfs(nums,visited,0,k-1,0,0,target)
        if cur_sum>target:
            return False
        for i in range(index,len(nums)):
            if visited[i]==0:

猜你喜欢

转载自blog.csdn.net/lgy54321/article/details/86235120