代码改变世界

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 };