leetcode 39. Combination Sum(回溯算法)

题目内容

给定一组候选数字(没有重复)和一个目标数字,找出候选数字之和与目标数字相等的所有唯一组合。

同一候选数字可以重复出现多次。

注意:

  1. 所有数字都是正整数
  2. 解集不能包含重复组合

分析

应用回溯算法来进行求解

  1. 先对candidates排序
  2. 用一个vector代替栈来保存candidates的下标,用sum保存当前栈中的和
  3. 1)当sum小于target时,将candidates中下标为栈顶元素的值入栈(为了避免重复,入栈不能小于该值);2)当sum等于target时,将结果保存,出栈,然后判断栈顶元素是否已经是candidates最后一个元素了,如果是的话继续出栈,最后将栈顶元素加一(candidates下标后移);当sum大于target时,不保存结果,操作和2)相同。
  4. 最后返回结果

代码

class Solution {
public:
    
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        sort(candidates.begin(), candidates.end());
        vector<vector<int>> rtn;
        if(candidates.size() == 0) return rtn;
        vector<int> conbination_stack; //保存下标
        conbination_stack.push_back(0);
        int sum = candidates[0];
        while(conbination_stack.size() != 0) {
            if(sum < target) {
                conbination_stack.push_back(conbination_stack[conbination_stack.size() - 1]);
                sum = sum + candidates[conbination_stack[conbination_stack.size() - 1]];
            }
            else {
                if(sum == target) {
                    vector<int> temp;
                    for(int i = 0; i < conbination_stack.size(); i++) {
                        temp.push_back(candidates[conbination_stack[i]]);
                    }
                    rtn.push_back(temp);
                }
                sum = sum - candidates[conbination_stack[conbination_stack.size() - 1]];
                conbination_stack.pop_back();
                while(conbination_stack.size() != 0 && conbination_stack[conbination_stack.size() - 1] == candidates.size() - 1) {
                    sum = sum - candidates[conbination_stack[conbination_stack.size() - 1]];
                    conbination_stack.pop_back();
                }
                if(conbination_stack.size() != 0) {
                    sum = sum - candidates[conbination_stack[conbination_stack.size() - 1]] + candidates[conbination_stack[conbination_stack.size() - 1] + 1];
                    conbination_stack[conbination_stack.size() - 1]++;
                }
            }
        }
        return rtn;
    }
};

总结

感觉我的代码还是没有达到最优,在入栈出栈的判断上应该还能改进,代码中间如果有不足的地方还望大佬指正!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值