698. 划分为k个相等的子集(递归,回溯)

题目描述:

算法思路:

感觉有桶的思想,定义一个大小为k,初始值为ave的容器

定义递归函数:参数传入,nums,k,nums的当前下标(地方时,从最后一个index进行传入),以及bucket。

递归结束条件为:当cur当前的下标小于0说明递归结束,返回true

剪枝操作:当数组的cur指向的值等于桶i的大小,或者桶i的大小减去数组cur指向的值大于等于nums数组最小值的时候(两者相减比最小值还小,说明这个桶肯定不能构成ave),进行下面的操作。

满足上面的条件的情况下,将nums[cur]加入bucket[i]中,bucket[i]减去相应的值,递归下一个元素。

回溯恢复桶的状态 bucket[i]+=nums[cur]

代码实现:

class Solution {
public:
    bool dfs(vector<int>& nums, int k,int cur,vector<int>& bucket){
        //递归结束条件
        if(cur<0){
            return true;
        }
        for(int i=0;i<k;i++){
            if(bucket[i]==nums[cur]||bucket[i]-nums[cur]>=nums[0]){
                bucket[i]-=nums[cur];
                if(dfs(nums,k,cur-1,bucket)){
                    return true;
                }
                //回溯
                bucket[i]+=nums[cur];
            }
        }
        return false;
    }
    bool canPartitionKSubsets(vector<int>& nums, int k) {
        int ave;
        int sum=0;
        for(auto &num:nums){
            sum+=num;
        }
        if(sum%k){
            return false;
        }
        ave=sum/k;
        vector<int> bucket(k,ave);
        sort(nums.begin(),nums.end());
        return dfs(nums,k,nums.size()-1,bucket); 
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值