标签:39 return target 组合 int startIndex candidates result 总和
✅做题思路or感想
这里依旧是找组合,故依旧是用回溯法
而因为这里的元素是可以重复选取的,所以这里的startIndex
在递归时不需要+1,或者直接干脆不用startIndex
就可以了
但是为了防止[2,2,3],[2,3,2]
这种重复,所以需要安排一下子集都是要递增的就好了
class Solution {
public:
vector<int>temp;
vector<vector<int>>result;
//这里直接取消了startIndex,不需要再强制性的缩小取值范围了,因为单个值可以无限的取
void dfs(vector<int>& candidates, int target) {
if (target < 0)return; //容易想到且有效的剪枝
if (target == 0) { //递归中止条件
result.push_back(temp);
return;
}
//处理数据
for (int i = 0; i < candidates.size(); i++) {
//这里if是维持子集是单调递增的!
if (temp.size() != 0 && temp.back() <= candidates[i] || temp.size() == 0) {
temp.push_back(candidates[i]);
dfs(candidates, target - candidates[i]);
temp.pop_back();//回溯
}
}
}
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
dfs(candidates, target);
return result;
}
};
标签:39,return,target,组合,int,startIndex,candidates,result,总和 来源: https://www.cnblogs.com/doomaa/p/16086286.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。