题目👉给定一个整数数组 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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。