/** * 简单理解就是 k个数之和等于n */ public List<List<Integer>> combinationSum3(int k, int n) { tracking(k, n, 1); return rt; }
/** * 回溯递归 * 1、需要一个装载数据的容器 * 2、需要一个装载结果集合的容器 * 3、需要统计相加目前的值 sum; */ public void tracking(int k, int n, int stId) { if (sum > n) {//目前的数值大于n,返回上一层 return; } if (item.size() == k && sum == n) {//符合条件,装载结果集 rt.add(new ArrayList<>(item)); return; } for (int i = stId; i < 10 - (k - item.size()) + 1; i++) {//题目限制了 1~9 item.offer(i); sum += i; tracking(k, n, i + 1); item.removeLast();//回溯 sum -= i; }
}
private List<List<Integer>> rt = new ArrayList<>();
private LinkedList<Integer> item = new LinkedList<>();