标签:
39、Combination Sum
题目
题目要求找出和为target的数字组合,并且每个整数可以多次使用。仔细思考可以发现,这道题目可以采用递归的方法来完成,比如举的例子,target=7,一开始可以选中2,并且2<7,因此,我只需要从[2,3,6,7]中寻找和为5(因为可以重复选择整数,因此需要从2开始而不是从下一个数3开始),如果后面的结果中找不出和为5,因此需要剔除当前选择的2,从下一个数3开始,按照这个递归继续执行。这样就把规模变小,代码如下:
class Solution { public: vector<vector<int>> combinationSum(vector<int>& candidates, int target) { vector<int> temp; vector<vector<int>> res; sort(candidates.begin(), candidates.end()); combinationSum(candidates,0,temp,res,target); return res; } void combinationSum(const vector<int>& candidates,int start,vector<int> &temp,vector<vector<int>> &res,int target) { if (0 == target) { res.push_back(temp); } for (int i=start;i<candidates.size();i++) { if(candidates[i]<=target) { temp.push_back(candidates[i]); combinationSum(candidates,i,temp,res,target-candidates[i]); temp.pop_back(); } } } };
--------------------------------------------------------------------------------------------分割线--------------------------------------------------------------------------------
40、Combination Sum II
题目
这道题和上一题差别不到,唯一的差别就是每个数至多使用一次,因此在之前的代码中需要做一次数据过滤,代码如下:
1 class Solution { 2 public: 3 vector<vector<int>> combinationSum2(vector<int>& candidates, int target) { 4 vector<int> temp; 5 vector<vector<int>> res; 6 sort(candidates.begin(), candidates.end()); 7 combinationSum(candidates,0,temp,res,target); 8 return res; 9 } 10 11 void combinationSum(const vector<int>& candidates,int start,vector<int> &temp,vector<vector<int>> &res,int target) 12 { 13 if (0 == target) 14 { 15 16 res.push_back(temp); 17 } 18 19 for (int i=start;i<candidates.size();i++) 20 { 21 22 if(candidates[i]<=target) 23 { 24 temp.push_back(candidates[i]); 25 combinationSum(candidates,i+1,temp,res,target-candidates[i]); 26 temp.pop_back(); 27 while(i+1<candidates.size() && candidates[i] == candidates[i+1])//跳过后续相同的整数 28 i++; 29 } 30 } 31 } 32 };
标签:
原文地址:http://www.cnblogs.com/LCCRNblog/p/5052185.html