遞迴:698、劃分為k個相等的子集

時之彼端發表於2020-11-23

思路:遞迴搜尋所有子集

class Solution {
    public boolean search(int[] groups,int row,int[] nums,int target){
        //遞迴結束條件
        if(row<0) return true;
        int v=nums[row--];
        for(int i=0;i<groups.length;i++){
            if(groups[i]+v<=target){
                //選擇元素
                groups[i]+=v;
                //所有元素使用完,且每一組和小於等於target,返回true
                if(search(groups,row,nums,target)) return true;
                //撤銷選擇
                groups[i]-=v;
            }
            //剪枝,為空時結束迴圈
            if(groups[i]==0) break;
        }
        return false;
    }
    public boolean canPartitionKSubsets(int[] nums, int k) {
        //求和
        int sum=Arrays.stream(nums).sum();
        if(sum%k>0) return false;
        int target=sum/k;
        Arrays.sort(nums);
        int row=nums.length-1;
        if(nums[row]>target) return false;
        //直接等於target的元素不參與搜尋
        while(nums[row]==target){
            row--;
            k--;
        }
        return search(new int[k],row,nums,target);
    }
}

 

相關文章