backtrack(k,n,sum,i+1);
backtrack(k,n,sum,i++);
在 C++ 中,递增运算符 i++
和表达式 i+1
之间有显著的区别:
i++
是后置递增运算符,表示先使用i
的当前值,然后将i
加 1。i+1
是一个简单的算术运算,返回i
的当前值加 1,但不改变i
的值。
backtrack(k, n, sum, i + 1); // 正确, 传递 i 的下一值,但不改变 i 的值
backtrack(k, n, sum, i++); // 错误, 传递当前 i 的值,然后 i 自增1
详细描述
backtrack(k, n, sum, i + 1);
这里传递了i
的值加 1,但是i
本身的值不会改变。所以,这并不会对当前递归状态下的i
产生影响。backtrack(k, n, sum, i++);
在这种情况下,i++
是后置递增运算符,这意味着当前函数调用传递的是i
的原始值,然后i
自增 1。这可能是不想要的效果,特别是在递归函数调用中,因为它在修改i
之后继续使用它,可能会导致索引管理混乱。
正确的方法:
一般来说,在递归和回溯中,你希望传递给下一层递归的是当前索引的下一个值而不是原始值并自增。所以,使用 i + 1
更加合适。
案例:
class Solution {
public:
vector<int> path;
vector<vector<int>> res;
void backtrack(int k,int n,int sum,int start)
{
if(path.size()==k)
{
if(sum==n)
{
res.push_back(path);
}
return;
}
for(int i=start;i<=9;i++)
{
sum+=i;
path.push_back(i);
backtrack(k,n,sum,i++);
sum-=i;
path.pop_back();
}
}
vector<vector<int>> combinationSum3(int k, int n) {
backtrack(k,n,0,1);
return res;
}
};
通过调试发现:
时间和空间复杂度