遇到需要多重for循环进行查找的问题,可以考虑将查找过程(for语句)放到递归函数中。
当递归函数需要其调用函数中的参数时,有两种处理方式。1.将参数设置为全局变量;2.将这些参数作为递归函数的形式参数传进去。
递归函数的框架:
1.进入递归要干什么,一般是判断是否达到目标或者判断是不是需要回溯;在条件满足的情况下再继续往下面步骤走。目的就是减少不必要的搜索。
2.for循环
3.循环内部先进行状态转移(该转移也可以合并到步骤5中,直接在参变量基础上转移,这时不用考虑回溯)
4.判断新状态下,能不能继续递归(该步骤可以放在第1步)。一般需要标记该目标是不是被搜过。
5.递归,对于递归层数确定的情况,需要加一个level参数。
6.回溯,回到转移前的状态。
代码如下:
public class Solution {
public List<List<Integer>> combinationSum3(int k, int n) {
List<List<Integer>> res = new ArrayList<List<Integer>>();
if(k<1 || n<1) return res;
List<Integer> cur = new ArrayList<Integer>();
rec(res, cur, 0, k, n, 1);
return res;
}
private void rec(List<List<Integer>> res, List<Integer> cur, int sum, int k, int n, int level) {
if(sum==n && k==0) {
res.add(new ArrayList(cur));
return;
} else if(sum>n || k<=0) return;
for(int i=level; i<=9; i++) {
cur.add(i);
rec(res, cur, sum+i, k-1, n, i+1);
cur.remove(cur.size() - 1);
}
}
}