传送门:
https://leetcode.com/problems/combination-sum/
https://leetcode.com/problems/combination-sum-ii/
思路:
用的是DFS递归搜索,如果有满足条件,则加入集合,否则弹出。
pop_back()函数一开始写错了。
STL这里太容易混淆了。
第一题AC代码:
class Solution{
public:
void solve(int cur,int n,vector<int>& res,vector<vector<int> >& ans,int target,int sum,vector<int>& candidates)
{
if(sum==target)
{
ans.push_back(res);
return;
}
for(int i=cur;i<n;i++)
{
if(sum+candidates[i]<=target)
{
res.push_back(candidates[i]);
solve(i,n,res,ans,target,sum+candidates[i],candidates);
res.pop_back();
}
}
}
vector<vector<int> > combinationSum(vector<int>&candidates,int target)
{
vector<vector<int> > ans;
vector<int> res;
sort(candidates.begin(),candidates.end());
solve(0,candidates.size(),res,ans,target,0,candidates);
return ans;
}
};
第二题思路是一样的:
考虑集合不能相等,所以多加了一个判定函数;同时判别式应该从下一位开始。
class Solution {
public:
bool check(vector<int>& res,vector<vector<int> >&ans)
{
for(int i=0;i<ans.size();i++)
if(res==ans[i]) return false;
return true;
}
void solve(int cur,int sum,int target,vector<int>& res,vector<int>& num,vector<vector<int> >& ans)
{
if(sum==target && check(res,ans))
{
ans.push_back(res);
return;
}
for(int i=cur;i<num.size();i++)
{
if(sum+num[i]<=target)
{
res.push_back(num[i]);
solve(i+1,sum+num[i],target,res,num,ans);
res.pop_back();
}
}
}
vector<vector<int> > combinationSum2(vector<int> &num, int target) {
vector<int> res;
vector<vector<int> > ans;
sort(num.begin(),num.end());
solve(0,0,target,res,num,ans);
return ans;
}
};
http://www.hrwhisper.me/archives/523,@hrwhisper 写的代码同样AC,具体思路是一样的,但他的判定条件和我的完全不同,并且我也看不懂他的代码
(换言之,按照那种思路的话[1,1,6]就不会出现在判例中)