力扣 题目40-- 组合总和 II
题目
题解
在力扣 题目39-- 组合总和中我们做过类似的题
而40题多加了条件 即 有重复数字而且每个数只能选一次
其实我们可以从39题条件转换一下,即无限制重复被选取->有限制重复被选取
例如 candidates = [2,5,2,1,2]
就是 1可以取1次 2可以取3次 5可以取1次
这样的话就简单了 我们只要在39题的基础上加入限制数量 于是稍加改造即可
使用map容器 key做为数字 value作为数量 而且map也可以自动排序
在39题的基础上加入
如果value为0则不选
如果value不为0则选 并且value-1
代码
1 #include<iostream> 2 #include<algorithm> 3 #include<vector> 4 #include<map> 5 using namespace std; 6 int binationSum(map<int, int>& m, int &target, map<int, int>::iterator position, int add, vector<int>& test, vector<vector<int>>& res) 7 { 8 //迭代器遍历 9 for (map<int, int>::iterator it = position; it != m.end(); it++) 10 { 11 //四种情况 1.如果当前数字的数量为0 则不取 跳过 12 if (it->second == 0) { 13 continue; 14 } 15 //四种情况 2.小于 add是上一轮给的值 如果这个数+it->first小于了 说明有可能成为解 更新一下add 继续递归 16 else if (add + it->first < target) { 17 //test变更 18 test.push_back(it->first); 19 //数量变更 20 it->second -= 1; 21 binationSum(m, target, it, add + (it->first), test, res); 22 //回溯 23 it->second += 1; 24 test.pop_back(); 25 } 26 //四种情况 3.等于 add是上一轮给的值 如果这个数+it->first等于了 说明test加上it->first就是解 直接给res 27 else if(add + it->first == target) 28 { 29 test.push_back(it->first); 30 res.push_back(test); 31 test.pop_back(); 32 } 33 //四种情况 4.大于 add是上一轮给的值 如果这个数 + it->first大于了 说明无解 直接返回 退出 34 else { 35 return 0; 36 } 37 } 38 return 0; 39 } 40 41 class Solution { 42 public: 43 vector<vector<int>> combinationSum2(vector<int>& candidates, int target) { 44 //把candidates放入map中 45 map<int, int> m; 46 for (int i = 0; i < candidates.size(); i++) { 47 auto mm = m.find(candidates[i]); 48 if (mm == m.end()) { 49 m.insert(pair<int, int>(candidates[i], 1)); 50 } 51 else 52 { 53 mm->second += 1; 54 } 55 } 56 vector<vector<int>> res; 57 vector<int> test; 58 //调用 59 binationSum(m, target, m.begin(), 0, test, res); 60 return res; 61 } 62 }; 63 int main() { 64 Solution sol; 65 vector<int> candidates = { 2,5,2,1,2 }; 66 int target = 5; 67 vector<vector<int>> res = sol.combinationSum2(candidates, target); 68 for (int i = 0; i < res.size(); i++) { 69 for (int j = 0; j < res[i].size(); j++) { 70 cout << res[i][j]; 71 } 72 cout << endl; 73 } 74 }