Leetcode 39 组合总和(回溯算法解题)
题目描述:
给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的数字可以无限制重复被选取
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/combination-sum
回溯算法简介:
回溯算法是一种试探性算法,会对每一次试探结果进行评估。如果当前的情况已经满足要求,则没有必要继续试探,也就是可以避免走弯路。如果当前情况满足要求,则保存相应的方法。
回溯的特性是可以在出现非法情况时,算法可以回退到之前的情景,可以返回一步或多步。
回溯法解题步骤:
- 判断当前情况是否非法,如果非法就立即返回;
- 当前情况如果满足,则保存该结果或方法;
- 当前情况下,遍历所有可能出现的情况并进行下一步尝试;
- 递归完毕后进行回溯,回溯的方法是取消上一步的尝试。
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()