力扣 题目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 }
View Code

 

posted @ 2022-05-01 13:46  无聊的阿库娅  阅读(33)  评论(0编辑  收藏  举报