代码改变世界

leetcode - Combination Sum

2013-03-26 19:11  张汉生  阅读(162)  评论(0)    收藏  举报

题目描述:点击此处

 1 class Solution {
 2 public:
 3     void getResult(vector<vector<int>> & rlt, vector<int> current, vector<int>* tags, int target){
 4         if (target <= 0)
 5             return;
 6         int maxN = 1000000000;
 7         if (!current.empty())
 8             maxN = *(current.end()-1);
 9         vector<int>::iterator vi;
10         for (vi = tags[target].begin(); vi!=tags[target].end() && *vi<=maxN; vi++){
11             vector<int> tvi = current;
12             tvi.push_back(*vi);
13             if (target-*vi==0){
14                 vector<int> rr;
15                 vector<int>::iterator ii;
16                 for (ii=tvi.end()-1; ii+1 != tvi.begin(); ii--){
17                     rr.push_back(*ii);
18                 }
19                 rlt.push_back(rr);
20             }
21             else getResult(rlt, tvi, tags, target-*vi);
22         }
23     }
24     vector<vector<int> > combinationSum(vector<int> &candidates, int target) {
25         // Start typing your C/C++ solution below
26         // DO NOT write int main() function
27         sort (candidates.begin(), candidates.end());
28         vector<int>::iterator vi;
29         vector<int>cands;
30         for (vi=candidates.begin(); vi!=candidates.end(); vi++){
31             if (!cands.empty() && *(cands.end()-1) == *vi)
32                 continue;
33             cands.push_back(*vi);
34         }
35         vector<int> * tags = new vector<int>[target+1]();
36         tags[0].push_back(0);
37         for (vi=cands.begin(); vi!=cands.end(); vi++){
38             for (int i=*vi; i<=target; i++){
39                 if (!tags[i-*vi].empty() && find(tags[i].begin(), tags[i].end(),*vi)==tags[i].end())
40                     tags[i].push_back(*vi);
41             }
42         }
43         vector<vector<int>> rlt;
44                   vector<int> current;
45         getResult(rlt, current, tags, target);
46         delete []tags;
47         return rlt;
48     }
49 };