class Solution {
public:
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
vector<vector<int> > ans;
vector<int> tmp;
if (candidates.empty()) {
return ans;
}
helper(candidates, target, 0, ans, tmp);
return ans;
}
private:
void helper(vector<int>& candidates, int target, int start, vector<vector<int> > &ans, vector<int> &tmp) {
if (target < 0) {
return;
}
if (target == 0) {
ans.push_back(tmp);
}
// 这里的start的值赋值个i, 决定了开始位置,也就是说,假设start==1, 那么只能取candidate[1]以及以后的数字
// start = 0
// i 的取值范围 : [0,1,2,3,4,5]
// start = 1
// i 的取值范围 : [1,2,3,4,5]
// start = 2
// i 的取值范围 : [2,3,4,5]
// start = 3
// i 的取值范围 : [3,4,5]
// 就这样依次走下去
// 这就有点相当于 for start == 0 to n:
// for i == start to n:
// for j == i to n : (下面的注释解释了这一行伪代码)
for (int i = start; i < candidates.size(); i++) {
tmp.push_back(candidates[i]);
// 最重要的一点在这个i上, 这关系到数据是如何被选取的,要考虑为什么不是start, 也不是start+1,也不是i+1
// start 假设start==0的时候 i的取值范围是[1,2,3,4,5]
// | i 现在i移动到了3 那么下一步要怎么进行呢? 题目要求,此时后面的数字的取值范围就是[3,5], // | | 因为可重复,所以能取到3, 最大的值呢就是5, 所以这里就只能取i
// 1 2 3 4 5
helper(candidates, target - candidates[i], i , ans, tmp);
tmp.pop_back();
}
}
};
leetcode39组合总和
最新推荐文章于 2023-11-28 19:57:34 发布