如何做网站旅游产品分析,什么是虚拟主机,互联网医院网站建设,商城网站开发案例backtrack(k,n,sum,i1);
backtrack(k,n,sum,i);
在 C 中#xff0c;递增运算符 i 和表达式 i1 之间有显著的区别#xff1a;
i 是后置递增运算符#xff0c;表示先使用 i 的当前值#xff0c;然后将 i 加 1。i1 是一个简单的算术运算#xff0c;返回 i 的当前值加 11);
backtrack(k,n,sum,i);
在 C 中递增运算符 i 和表达式 i1 之间有显著的区别
i 是后置递增运算符表示先使用 i 的当前值然后将 i 加 1。i1 是一个简单的算术运算返回 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:vectorint path;vectorvectorint res;void backtrack(int k,int n,int sum,int start){if(path.size()k){if(sumn){res.push_back(path);}return;}for(int istart;i9;i){sumi;path.push_back(i);backtrack(k,n,sum,i);sum-i;path.pop_back();}}vectorvectorint combinationSum3(int k, int n) {backtrack(k,n,0,1);return res;}
}; 通过调试发现 时间和空间复杂度