题目
给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的数字可以无限制重复被选取。
说明:
所有数字(包括 target)都是正整数。
解集不能包含重复的组合。
示例 1:
输入: candidates = [2,3,6,7], target = 7,
所求解集为:
[
[7],
[2,2,3]
]
示例 2:
输入: candidates = [2,3,5], target = 8,
所求解集为:
[
[2,2,2,2],
[2,3,3],
[3,5]
]
分析
小仙女本人第一次拿到这个题的时候的人生都绝望了,前面的三数之和和四数之和,对于一个不太会编程的我来说,智慧已经到了头顶了,现在竟然可以重复使用数组里面的数。超出我的智力范围了。于是搜集资料,深吸一口长长的气开始突破自己。
从度娘那里看到有人用的回溯法,这里就用递归法解决一下吧。哈哈哈哈哈哈哈哈哈哈哈。(好傻)。回头再学学回溯的方法。
和前面的三数之和和四数之和一样,先确定一个数,然后用,目标值一个一个的减,最后为0的时候就大功造成了。这里一个一个的减就是用的递归的方法
解答(深搜)
// An highlighted block
class Solution {
public:
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
sort(candidates.begin(),candidates.end());//便于用后面的剪枝
vector<vector<int>> res;
vector<int> cur;//建立临时满足条件的向量;
dfs(candidates,0,target,res,cur);
return res;
}
private:
void dfs(vector<int>& candidates,int s,int target, vector<vector<int>>& res,vector<int>& cur )
{
if(target==0)
{
res.push_back(cur);
return;
}
for(int i=s;i<candidates.size();i++)
{
if(candidates[i]>target)break;
cur.push_back(candidates[i]);
dfs(candidates,i, target-candidates[i],res,cur );
cur.pop_back();
}
}
};//来着花花酱的解答
解答的灵魂呢就是从小到大排好序,从第一个数开始使劲的减,直到减到0,把他放进cur里面。如果过程中遇到比目标值大的数就直接出循环。