leetcode 39
先排序,然后dfs
注意先整全局变量可以减少空间利用
class Solution { vector<vector<int>>ret; vector<int>temp; vector<int> srt; public: vector<vector<int>> combinationSum(vector<int>& candidates, int target) { srt=candidates; sort(srt.begin(),srt.end()); dfs(target,0); //从下标0开始,杜绝0 1 ,1 0下这样的重复 return ret; } void dfs(int target,int index){ if(target==0) { ret.push_back(temp); return; } for(int i=index;i<srt.size()&&(target-srt[i]>=0);i++) { temp.push_back(srt[i]); dfs(target-srt[i],i); temp.pop_back(); } return; } };
leetcode 40
在39的基础上改了改
注意 vector的find是借助algorithm实现的
class Solution { vector<vector<int>>ret; vector<int>temp; vector<int> srt; public: vector<vector<int>> combinationSum2(vector<int>& candidates, int target) { srt=candidates; sort(srt.begin(),srt.end()); dfs(target,0); //从下标0开始,杜绝0 1 ,1 0下这样的重复 return ret; } void dfs(int target,int index){ if(target==0) { //vector<vector<int>> :: itrator it; if(find(ret.begin(),ret.end(),temp)==ret.end()) ret.push_back(temp); return; } for(int i=index;i<srt.size()&&(target-srt[i]>=0);i++) { temp.push_back(srt[i]); dfs(target-srt[i],i+1); temp.pop_back(); } return; } };
然后剪枝的话这样
class Solution { vector<vector<int>>ret; vector<int>temp; int tp; vector<int> srt; int tar; public: vector<vector<int>> combinationSum2(vector<int>& candidates, int target) { srt=candidates; sort(srt.begin(),srt.end()); tar=target; dfs(target,0); //从下标0开始,杜绝0 1 ,1 0下这样的重复 return ret; } void dfs(int target,int index){ if(target==0) { //vector<vector<int>> :: itrator it; //if(find(ret.begin(),ret.end(),temp)==ret.end()) ret.push_back(temp); return; } for(int i=index;i<srt.size()&&(target-srt[i]>=0);i++) { if(i>index&&srt[i]==srt[i-1]) //index表示的是当前target对应的,开始的位置,后续如果==index,对于同一个target会形成重复;若是不同target不会重复 continue; temp.push_back(srt[i]); dfs(target-srt[i],i+1); temp.pop_back(); } return; } };