2022年9月20日 每日一题 698 中等

69 阅读1分钟

题目👉给定一个整数数组  nums 和一个正整数 k,找出是否有可能把这个数组分成 k 个非空子集,其总和都相等

思路

需要满足条件👉数组各和对 k 取余等于 0 (表明可划分),数组最大值小于等于

大小排序,取最大值,如果没有超过 sum/k ,取次大值加上,如果总和没超过 sum/k ,继续向下递归,等于时 k-1 ( 表明需要分 k 个子集已经完成一个,当剩下最后一个时理所当然可以满足题意,返回 true )

回溯思想:当前值加上新值大于 sum/k ,返回上一层级,递归次次大值

重点在于回溯算法的模板,多做题背熟即可

class Solution {
    private int [] a;
    public boolean canPartitionKSubsets(int[] nums, int k) {
        int n=nums.length;
        a=new int[n];
        Arrays.sort(nums);
        int sum=Arrays.stream(nums).sum();
        if(sum%k!=0 || nums[n-1]>sum/k)return false;
        return f(nums,n-1,sum/k,0,k);
    }
    public boolean f(int []nums,int index , int tar , int cur , int k){
        if(k==0)return true;
        if(cur == tar ) return f(nums,nums.length-1,tar,0,k-1);
        for(int i=index;i>=0;i--){
            if(a[i]==1 || cur+nums[i]>tar) continue;
            a[i]=1;
            if(f(nums,i-1,tar,cur+nums[i],k)) return true;
            a[i]=0;
            while(i>0 && nums[i-1]==nums[i]) i--;
        }
        return false;
    }
}

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/partition-to-k-equal-sum-subsets
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。