leetcode 链接:40. 组合总和 II
题目
给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的每个数字在每个组合中只能使用一次。
注意:解集不能包含重复的组合。
解答 & 代码
递归回溯
class Solution {private:// 递归回溯得到所有不重复的组合,存在 resultList 中void findCombinations(vector<int> candidates, int target, int left, vector<int>& result, vector<vector<int>>& resultList){// 从左边界开始遍历数组中的元素for(int i = left; i < candidates.size() && candidates[i] <= target; ++i){// 去重:如果当前元素不是左边界并且和前一个元素相同,则跳过while(i != left && i < candidates.size() && candidates[i] == candidates[i - 1])++i;// 如果当前下标越界或者当前元素值大于 target,直接返回(已排序,后面元素只会更大,因此可剪枝)if(i >= candidates.size() || candidates[i] > target)return;result.push_back(candidates[i]); // 选取当前元素// 如果当前元素就等于 target,将当前的组合存入 resultListif(candidates[i] == target)resultList.push_back(result);else // 递归寻找组合的下一个元素findCombinations(candidates, target - candidates[i], i + 1, result, resultList);result.pop_back(); // 回溯}}public:vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {sort(candidates.begin(), candidates.end()); // 升序排序(为了去重)vector<int> result;vector<vector<int>> resultList;findCombinations(candidates, target, 0, result, resultList);return resultList;}};
执行结果:
执行结果:通过执行用时:0 ms, 在所有 C++ 提交中击败了 100.00% 的用户内存消耗:12.7 MB, 在所有 C++ 提交中击败了 16.31% 的用户
