确定递归 输入参数: currentSum, targetSum, staertInd(控制起始点)
确定截止条件: size == k. 并且 curSum == targretSum
for 循环: 确定的是树的宽度
结果里要多少个数字确定的是树的深度(也就是递归到底有多深)
一维数组和二维数组(答案) 作为全局变量放在最外面
答案如下:
class Solution {
List<List<Integer>> res = new ArrayList<>();
LinkedList<Integer> path = new LinkedList<>();
public List<List<Integer>> combinationSum3(int k, int n) {
//if (k > n) return res;
helper(n, k,0, 1);
return res;
}
void helper(int targetSum, int k, int sum, int startInd){
//递归截止条件
if (path.size() == k && targetSum == sum) {
res.add(new ArrayList<>(path));
return;
};
for (int i = startInd; i <= 9; i ++ ){
sum += i;
path.add(i);
helper(targetSum, k, sum, i + 1);
//回溯
sum -=i;
path.removeLast();
}
}
}
不会的地方? 如何每次的for在不同的范围内?
答: 用String array 做一个mapping, 将digit拿出来之后 直接找到对应的区域。 还有一个和之前不一样的改动就是本题不需要startInd,因为startInd 的作用是 为了避免[1, 2] [2,1] 的情况, 但是改题目,完全可以2个按钮同时选中第一个。所以只需要一个变量deepth 传入来控制递归截止就可以了