Leetcode 40. Combination Sum II
阿新 • • 發佈:2018-12-15
文章作者:Tyan 部落格:noahsnail.com | CSDN | 簡書
1. Description
2. Solution
- Version 1
class Solution { public: vector<vector<int>> combinationSum2(vector<int>& candidates, int target) { set<vector<int>> s; sort(candidates.begin(), candidates.end()); vector<int> combination; combinationSum2(s, candidates, combination, target, 0, 0); return vector<vector<int>>(s.begin(), s.end()); } private: void combinationSum2(set<vector<int>>& result, vector<int>& candidates, vector<int>& combination, int& target, int sum, int begin) { if(sum > target) { return; } if(sum == target) { result.insert(combination); return; } for(int i = begin; i < candidates.size(); i++) { combination.push_back(candidates[i]); combinationSum2(result, candidates, combination, target, sum + candidates[i], i + 1); combination.pop_back(); } } };
- Version 2
class Solution { public: vector<vector<int>> combinationSum2(vector<int>& candidates, int target) { set<vector<int>> s; sort(candidates.begin(), candidates.end()); vector<int> combination; combinationSum2(s, candidates, combination, target, 0, 0); return vector<vector<int>>(s.begin(), s.end()); } private: void combinationSum2(set<vector<int>>& result, vector<int>& candidates, vector<int>& combination, int& target, int sum, int begin) { if(sum > target) { return; } if(sum == target) { result.insert(combination); return; } for(int i = begin; i < candidates.size(); i++) { if(sum + candidates[i] > target) { break; } combination.push_back(candidates[i]); combinationSum2(result, candidates, combination, target, sum + candidates[i], i + 1); combination.pop_back(); } } };
- Version 3
class Solution { public: vector<vector<int>> combinationSum2(vector<int>& candidates, int target) { vector<vector<int>> result; sort(candidates.begin(), candidates.end()); vector<int> combination; combinationSum2(result, candidates, combination, target, 0, 0); return result; } private: void combinationSum2(vector<vector<int>>& result, vector<int>& candidates, vector<int>& combination, int& target, int sum, int begin) { if(sum > target) { return; } if(sum == target) { result.push_back(combination); return; } for(int i = begin; i < candidates.size(); i++) { if(sum + candidates[i] > target) { break; } if(i > begin && candidates[i] == candidates[i - 1]) { continue; } combination.push_back(candidates[i]); combinationSum2(result, candidates, combination, target, sum + candidates[i], i + 1); combination.pop_back(); } } };