如果条件不成立,则将 i 加入 path 中,并把 curSum 加上 i,然后判断此时的path是否满足递归结束条件:
若不满足,则进入下一层递归,下一次循环起点为 i + 1;
若满足,则返回后把 i 从 path 中移除,并把 curSum 减去 i。然后 i++,进入下一次循环。
for(int i = startIndex; i <=9; i++){if(n -(curSum + i)<0)return;
curSum += i;
path.add(i);backtracking(n, k, i +1);
path.remove(path.size()-1);// 在回溯法中,有加入就要有弹出
curSum -= i;}
完整代码(核心代码模式)
classSolution{List<Integer> path =newArrayList<>();List<List<Integer>> result =newArrayList<>();int curSum =0;publicList<List<Integer>>combinationSum3(int k,int n){backtracking(n, k,1);return result;}publicvoidbacktracking(int n,int k,int startIndex){if(path.size()== k){if(curSum == n) result.add(newArrayList(path));return;}for(int i = startIndex; i <=9; i++){if(n -(curSum + i)<0)return;
curSum += i;
path.add(i);backtracking(n, k, i +1);
path.remove(path.size()-1);
curSum -= i;}}}