[LeetCode]problem 40. Combination Sum II
2016-06-08 08:45
155 查看
TAG
递归回溯
组合数和
link
方法
与Combination Sum 相比,每个数仅能被使用一次
候选集不再是
set,而是
collections,就是可以包含重复数字了
怎么办呢?针对第一个,非常简单,只需要把开始递归的开始下标设为当前位置的下一个位置即可。
重复?想象一下重复的组合时怎么来的:
input : [1,1,3,4,5]
如果对第一个1,我们在
[3,4,5]中能够找到候选数字,那么对第二个1,肯定也能够找到相同的候选数字。虽然本质上第二个1与第一个1是不同的,然而从最后的组合结果看却是相同的。因而,之前的方法是不能避免重复这个问题的。解决方法是(看了下题解发现的…)开始下次选择前,跳过重复数字即可。即是,完成第一个1的选择后,跳过第二个1。(这时就要求候选集必须排序了!)
代码
class Solution { public: vector<vector<int>> combinationSum2(vector<int>& candidates, int target) { vector<vector<int>> result ; vector<int> selectedNums; sort(candidates.begin(), candidates.end()); // for efficent quit in select selectNum(selectedNums, candidates, target, result); return result; } private: void selectNum(vector<int> ¤tSelectedNums, const vector<int> &candidates, int target, vector<vector<int>> &result, size_t startPos=0) { if(target < 0) { return ;} else if(target == 0){ result.push_back(currentSelectedNums); return; } for(auto iter = candidates.cbegin() + startPos; iter < candidates.cend() && *iter <= target; ++iter) { // try to add current number to currentSelectedNums currentSelectedNums.push_back(*iter); selectNum(currentSelectedNums, candidates, target - *iter, result, iter-candidates.cbegin() + 1); // try next num currentSelectedNums.pop_back(); // skip duplicates (the same number with previous may cause duplicates result .) while(iter + 1 < candidates.cend() && *(iter+1) == *iter) ++iter; } } };
相关文章推荐
- leetcode 179 Largest Number
- leetcode 24 Swap Nodes in Pairs
- leetcode 2 Add Two Numbers 方法1
- leetcode 2 Add Two Numbers 方法2
- leetcode----Longest Substring Without Repeating Characters
- [LeetCode]47 Permutations II
- [LeetCode]65 Valid Number
- [LeetCode]123 Best Time to Buy and Sell Stock III
- [LeetCode] String Reorder Distance Apart
- [LeetCode] Sliding Window Maximum
- [LeetCode] Find the k-th Smallest Element in the Union of Two Sorted Arrays
- [LeetCode] Determine If Two Rectangles Overlap
- [LeetCode] A Distance Maximizing Problem
- leetcode_linearList
- leetcode_linearList02
- 021-Merge Two Sorted Lists(合并两个排好序的单链表);leetcode
- LeetCode[Day 1] Two Sum 题解
- LeetCode[Day 2] Median of Two Sorted Arrays 题解
- LeetCode[Day 3] Longest Substring Without... 题解
- LeetCode [Day 4] Add Two Numbers 题解