leetcode - Combination Sum II
2013-03-26 19:44 张汉生 阅读(183) 评论(0) 编辑 收藏 举报题目描述:点击此处
1 class Solution { 2 public: 3 int * cts; 4 void getResult(vector<vector<int>> & rlt, vector<int> current, vector<int>* tags, int target){ 5 if (target <= 0) 6 return; 7 int maxN = 1000000000; 8 if (!current.empty()) 9 maxN = *(current.end()-1); 10 vector<int>::iterator vi; 11 for (vi = tags[target].begin(); vi!=tags[target].end() && *vi<=maxN; vi++){ 12 if (!current.empty()){ 13 int ct = 1; 14 vector<int>::iterator cti = current.end()-1; 15 while (cti+1!=current.begin() && *cti==*vi){ 16 ct++; 17 cti--; 18 } 19 if (ct>cts[*vi]) 20 continue; 21 } 22 vector<int> tvi = current; 23 tvi.push_back(*vi); 24 if (target-*vi==0){ 25 vector<int> rr; 26 vector<int>::iterator ii; 27 for (ii=tvi.end()-1; ii+1 != tvi.begin(); ii--){ 28 rr.push_back(*ii); 29 } 30 rlt.push_back(rr); 31 } 32 else getResult(rlt, tvi, tags, target-*vi); 33 } 34 } 35 vector<vector<int> > combinationSum2(vector<int> &num, int target){ 36 // Start typing your C/C++ solution below 37 // DO NOT write int main() function 38 sort (num.begin(), num.end()); 39 vector<int>::iterator vi; 40 vector<int> * tags = new vector<int>[target+1](); 41 cts = new int[target+1]; 42 for (int i=0; i<=target; i++) 43 cts[i]=0; 44 tags[0].push_back(0); 45 for (vi=num.begin(); vi!=num.end(); vi++){ 46 if (*vi<=target) 47 cts[*vi]++; 48 else break; 49 for (int i=target; i>=*vi; i--){ 50 if (!tags[i-*vi].empty() && find(tags[i].begin(), tags[i].end(),*vi)==tags[i].end()) 51 tags[i].push_back(*vi); 52 } 53 } 54 vector<vector<int>> rlt; 55 vector<int> current; 56 getResult(rlt, current, tags, target); 57 delete[]cts; 58 delete []tags; 59 return rlt; 60 } 61 };