LeetCode-39. Combination Sum

Description

Given a set of candidate numbers (candidates) (without duplicates) and a target number (target), find all unique combinations in 
candidates where the candidate numbers sums to target.

The same repeated number may be chosen from candidates unlimited number of times.

Note

All numbers (including target) will be positive integers.
The solution set must not contain duplicate combinations.

Example 1

Input: candidates = [2,3,6,7], target = 7,
A solution set is:
[
  [7],
  [2,2,3]
]

Example 2

Input: candidates = [2,3,5], target = 8,
A solution set is:
[
  [2,2,2,2],
  [2,3,3],
  [3,5]
]

Solution 1(C++)

class Solution {
public:
    void helper(vector<vector<int>> &res, vector<int> &candidates, int index, vector<int> cur, int target) {
        if(target == 0) {res.push_back(cur); return;}
        if(target < 0) return;
        for(int i=index; i < candidates.size(); i++) {
            cur.push_back(candidates[i]);
            helper(res, candidates, i, cur, target-candidates[i]);
            cur.pop_back();
        }
        return;
    }

    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        vector<vector<int>> res;
        vector<int> cur;
        helper(res, candidates, 0, cur, target);
        return res;
    }
};

Solution 2(C++)

static int x = [](){std::ios::sync_with_stdio(false);cin.tie(NULL);return 0;}();
class Solution {
public:
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        vector<vector<int>> res;
        sort(candidates.begin(), candidates.end());
        if(candidates.empty() || target < candidates[0])
            return res;
        vector<int> com;
        findcom(candidates, target, res, com, 0);
        return res;
    }

    void findcom(vector<int>& candidates, int target, vector<vector<int>>& res, vector<int>& com, int begin)
    {
        if(!target)
            res.push_back(com);
        for (int i = begin; i != candidates.size() && target >= candidates[i]; ++i){
            com.push_back(candidates[i]);
            findcom(candidates, target - candidates[i], res, com, i);
            com.pop_back();
        }
    }
};

算法分析

这道题用回溯的方法做,其实不难。有意思的就是解法一比解法二慢了很多。然而解法一与解法二之间的主要差别就是在解法二限制了前寻的深度,而解法一没有,所以这导致解法二回溯更快。

还有就是要注意,前寻的时候,可以找重复的值,但不能在数组中回头找,这一点是要注意的。

程序分析

略。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值