LeetCode-Combination Sum II-组合求和-DFS
https://oj.leetcode.com/problems/combination-sum-ii/
一道DFS搜索的题目,需要注意去除重复。可以使用一个map记录每个数字重复的次数。然后每次递归时-1,在递归退回时在加回来。
class Solution { public: int n,m; vector <int> a; map <int,int> cm; vector <int> cur; vector<vector<int>> tot; void Solve(int p,int t){ if (t==0) { tot.push_back(cur); return; } if (p==n) return; if (t>=a[p]){ if (cm[a[p]]) { cur.push_back(a[p]); cm[a[p]]--; Solve(p,t-a[p]); cm[a[p]]++; cur.pop_back(); } } Solve(p+1,t); } vector<vector<int>> combinationSum2(vector<int> &num, int target) { n=num.size(); for(int i=0;i<n;i++){ if(cm.find(num[i])==cm.end()) cm[num[i]]=1; else cm[num[i]]++; } a.resize(cm.size()); int cnt=0; for(auto it=cm.begin();it!=cm.end();it++){ a[cnt++]=it->first; } n=a.size(); Solve(0,target); return tot; } };