[Leetcode] 40. Combination Sum II 解题报告
2017-01-02 22:32
253 查看
题目:
Given a collection of candidate numbers (C) and a target number (T), find all unique combinations in C where
the candidate numbers sums to T.
Each number in C may only be used once in the combination.
Note:
All numbers (including target) will be positive integers.
The solution set must not contain duplicate combinations.
For example, given candidate set
A solution set is:
思路:
1、最终去重法:思路和Leetcode 39基本一致,但是在得到结果之后,去掉结果中的重复元素,返回最终结果。这种思路耗费的时间复杂度较高,不上代码。
2、中间去重法:在backtracking的过程中保证不出现重复的解。方法是在每一层深搜的过程中,分别处理两种不相交的情况:1)不包括当前元素;2)包含当前元素,但是在递归进行下一层搜索之后,跳过所有和当前元素相同的元素,这是因为:所有包含这些相同元素的解在递归进行下一层搜索的过程中都已经找出来了。
代码:
Given a collection of candidate numbers (C) and a target number (T), find all unique combinations in C where
the candidate numbers sums to T.
Each number in C may only be used once in the combination.
Note:
All numbers (including target) will be positive integers.
The solution set must not contain duplicate combinations.
For example, given candidate set
[10, 1, 2, 7, 6, 1, 5]and target
8,
A solution set is:
[ [1, 7], [1, 2, 5], [2, 6], [1, 1, 6] ]
思路:
1、最终去重法:思路和Leetcode 39基本一致,但是在得到结果之后,去掉结果中的重复元素,返回最终结果。这种思路耗费的时间复杂度较高,不上代码。
2、中间去重法:在backtracking的过程中保证不出现重复的解。方法是在每一层深搜的过程中,分别处理两种不相交的情况:1)不包括当前元素;2)包含当前元素,但是在递归进行下一层搜索之后,跳过所有和当前元素相同的元素,这是因为:所有包含这些相同元素的解在递归进行下一层搜索的过程中都已经找出来了。
代码:
class Solution { public: vector<vector<int>> combinationSum2(vector<int>& candidates, int target) { vector<vector<int>> ret; if(candidates.size() == 0) return ret; sort(candidates.begin(), candidates.end()); vector<int> line; combinationSum2(candidates, 0, target, ret, line); return ret; } private: void combinationSum2(vector<int>& candidates, int index, int target, vector<vector<int>>& ret, vector<int> &line) { if(target == 0) { ret.push_back(line); return; } if(index == candidates.size() || candidates[index] > target) return; // try to make candidates[index] included in the ret line.push_back(candidates[index]); combinationSum2(candidates, index + 1, target - candidates[index], ret, line); while(index < candidates.size() - 1 && candidates[index] == candidates[index + 1]) ++index; line.pop_back(); // try to make candidates[index] excluded in the ret combinationSum2(candidates, index + 1, target, ret, line); } };
相关文章推荐
- 【LeetCode】Reorder List 解题报告
- 【LeetCode】Palindrome Partitioning 解题报告
- [leetcode] 217. Contains Duplicate 解题报告
- [Leetcode] 29. Divide Two Integers 解题报告
- leetcode解题报告(9):Implement strStr()
- leetCode解题报告之Copy List with Random Pointer
- [LeetCode 解题报告]016. 3Sum Closest
- 【LeetCode】717. 1-bit and 2-bit Characters 解题报告
- [Leetcode] 112. Path Sum 解题报告
- [Leetcode] 31. Next Permutation 解题报告
- [Leetcode] 646. Maximum Length of Pair Chain 解题报告
- LeetCode: Restore IP Addresses 解题报告
- leetcode解题报告(12):Maximum Subarray
- [Leetcode] 318. Maximum Product of Word Lengths 解题报告
- [Leetcode] 648. Replace Words 解题报告
- Leetcode 393. UTF-8 Validation UTF-8 编码识别 解题报告
- [Leetcode] 118. Pascal's Triangle 解题报告
- [Leetcode] 765. Couples Holding Hands 解题报告
- [leetcode] 302. Smallest Rectangle Enclosing Black Pixels 解题报告
- [leetcode] 375. Guess Number Higher or Lower II 解题报告