Combination Sum II 【leetcode】
2013-09-16 21:54
393 查看
和前一题不同的是,集合的中每个元素只能使用一次。
将元素组排序后,用数组data保存集合中不同的元素,数组limit记录出现的相应元素个数。
之后做法类似,用dfs遍历所有的可能情况,但在对数组v取值时需要考虑元素个数的上限,即数组limit对应值。
将元素组排序后,用数组data保存集合中不同的元素,数组limit记录出现的相应元素个数。
之后做法类似,用dfs遍历所有的可能情况,但在对数组v取值时需要考虑元素个数的上限,即数组limit对应值。
int len; vector<int> v,limit,data; vector<vector<int> > l; class Solution { public: vector<vector<int> > combinationSum2(vector<int> &num, int target) { len=num.size(); sort(num.begin(),num.end()); limit.clear(); data.clear(); for(int i=0,j=0,n=0;i<len;++i) { if(i==0||num[i]!=num[i-1]) { if(i!=0)limit.push_back(n); data.push_back(num[i]); n=1; ++j; } else ++n; if(i==len-1)limit.push_back(n); } len=data.size(); v.clear(); l.clear(); if(len==0)return l; v.resize(len); hehe(0,target,data); return l; } void hehe(int p,int target,vector<int > &data) { if(p==len) { if(target!=0)return; vector<int> temp; for(int i=0;i<len;++i) { for(int j=0;j<v[i];++j) temp.push_back(data[i]); } l.push_back(temp); return; } for(int i=0;i<=limit[p]&&data[p]*i<=target;++i) { v[p]=i; hehe(p+1,target-data[p]*i,data); } return; } };
相关文章推荐
- [leetcode]Combination Sum II @ Python
- Combination Sum II 无序数组中找组合(每个元素只能用一次)使得和为target@LeetCode@LeetCode
- [LeetCode]040-Combination Sum II
- leetcode第39题--Combination Sum II
- [leetcode] 39& 40 Combination Sum I& II
- Leetcode--Combination Sum II
- LeetCode Combination Sum II
- [leetcode] Combination Sum II
- 【Leetcode】Combination Sum II (Backtracking)
- 子集系列(二) 满足特定要求的子集,例 [LeetCode] Combination, Combination Sum I, II
- [leetcode]Combination Sum II
- LeetCode Combination Sum II
- LeetCode: Combination Sum II
- [LeetCode] Combination Sum II
- Leetcode 40 Combination Sum II
- Leetcode 40 - Combination Sum II
- Leetcode | Combination Sum I && II
- LeetCode 39 && 40 Combination Sum I && II 关键在于剪枝,剪枝讨论在末尾
- leetcode Combination Sum II
- 【leetcode】Array——Combination Sum I/II/III