1. 题目
2. 思路
(1) 回溯法
- 利用栈存储路径实现回溯法,重点在于剪枝策略,分别是:
- 当和大于n或个数大于k时,直接返回;
- for循环的长度以k为限制。
3. 代码
import java.util.ArrayList;
import java.util.Deque;
import java.util.LinkedList;
import java.util.List;
public class Test {
public static void main(String[] args) {
}
}
class Solution {
private int k;
private int n;
private Deque<Integer> stack;
private int sum;
private List<List<Integer>> res;
public List<List<Integer>> combinationSum3(int k, int n) {
this.k = k;
this.n = n;
stack = new LinkedList<>();
sum = 0;
res = new ArrayList<>();
backtrack(1);
return res;
}
private void backtrack(int index) {
if (sum == n && stack.size() == k) {
res.add(new ArrayList<>(stack));
return;
}
if (sum >= n || stack.size() >= k) {
return;
}
for (int i = 9 - (k - stack.size()) + 1; i >= index; i--) {
stack.push(i);
sum += i;
backtrack(i + 1);
stack.pop();
sum -= i;
}
}
}