Leetcode 39 组合总和(回溯算法解题)

题目描述:

给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。

candidates 中的数字可以无限制重复被选取

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/combination-sum

回溯算法简介:

回溯算法是一种试探性算法,会对每一次试探结果进行评估。如果当前的情况已经满足要求,则没有必要继续试探,也就是可以避免走弯路。如果当前情况满足要求,则保存相应的方法。

回溯的特性是可以在出现非法情况时,算法可以回退到之前的情景,可以返回一步或多步。

回溯法解题步骤:

  1. 判断当前情况是否非法,如果非法就立即返回;
  2. 当前情况如果满足,则保存该结果或方法;
  3. 当前情况下,遍历所有可能出现的情况并进行下一步尝试;
  4. 递归完毕后进行回溯,回溯的方法是取消上一步的尝试。
class Solution {
private:
    vector<vector <int>> results;
    vector<int> solution;
public:
    void backtracking(vector<int> candidates, int target, int start){
        if(target < 0)
            return;
        if(target == 0){
            results.push_back(solution);
            return;
        }
        for(int i=start; i<candidates.size() && candidates[i]-target<=0; i++){
            solution.push_back(candidates[i]);
            backtracking(candidates, target-candidates[i], i);
            solution.pop_back();
        }
    }
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        std::sort(candidates.begin(), candidates.end());
        backtracking(candidates, target, 0);
        return results;        
    }
};
// 本解法中用到了剪枝的解法,来自leetcode上一位大神的解法(liweiwei1419)。
// https://leetcode-cn.com/problems/combination-sum/solution/hui-su-suan-fa-jian-zhi-python-dai-ma-java-dai-m-2/

 

 可以看到运行时间和内存消耗都有很大优化。

 

* DFS 深度优先搜索算法

* vector:  1. push_back()

      2. pop_back() 

posted @ 2019-10-06 11:48  牧牛子  阅读(274)  评论(0编辑  收藏  举报