题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
思路:
关键点:去重
不去重的结果
没去重的代码(也就是我写的):
- class Solution {
- public:
- std::vector
int>> result; - std::vector<int> res;
- vector
int>> combinationSum2(vector<int>& candidates, int target) { - if(candidates.size() == 0) return result;
- sort(candidates.begin(), candidates.end());
- comb(candidates, target, 0);
- return result;
- }
-
- void comb(vector<int>& candidates, int target, int index)
- {
- int sum = 0;
- for(int i = 0; i < res.size(); i++)
- {
- sum += res[i];
-
- }
- if(index > candidates.size() && sum > target)
- {
- return;
- }
-
- if(sum == target)
- {
- result.push_back(res);
- return;
- }
-
- for(int i = index; i < candidates.size(); i++)
- {
-
- res.push_back(candidates[i]);
- comb(candidates, target, i+1);//注意这里是i+1,经常写成index+1
- res.pop_back();
- }
- }
- };
随想录代码:
- class Solution {
- private:
- vector
int>> result; - vector<int> path;
- void backtracking(vector<int>& candidates, int target, int sum, int startIndex, vector<bool>& used) {
- if (sum == target) {
- result.push_back(path);
- return;
- }
- for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target; i++) {
- // used[i - 1] == true,说明同一树枝candidates[i - 1]使用过
- // used[i - 1] == false,说明同一树层candidates[i - 1]使用过
- // 要对同一树层使用过的元素进行跳过
- if (i > 0 && candidates[i] == candidates[i - 1] && used[i - 1] == false) {
- continue;
- }
- sum += candidates[i];
- path.push_back(candidates[i]);
- used[i] = true;
- backtracking(candidates, target, sum, i + 1, used); // 和39.组合总和的区别1,这里是i+1,每个数字在每个组合中只能使用一次
- used[i] = false;
- sum -= candidates[i];
- path.pop_back();
- }
- }
-
- public:
- vector
int>> combinationSum2(vector<int>& candidates, int target) { - vector<bool> used(candidates.size(), false);
- path.clear();
- result.clear();
- // 首先把给candidates排序,让其相同的元素都挨在一起。
- sort(candidates.begin(), candidates.end());
- backtracking(candidates, target, 0, 0, used);
- return result;
- }
- };