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 };
                    
                
                
            
        
浙公网安备 33010602011771号