77. 组合
回溯法解题
class Solution {
private List<List<Integer>> res = new ArrayList<>();
private List<Integer> temp = new ArrayList<>();
public List<List<Integer>> combine(int n, int k) {
backtracking(n, k, 1);
return res;
}
private void backtracking(int n, int k, int index) {
// 当找到满足条件的组合时, 加入到res中,并返回
if (temp.size() == k) {
res.add(new ArrayList<>(temp));
return;
}
for (int i = index; i <= n; i ++) {
// 处理一个数字
temp.add(i);
// 开始递归
backtracking(n, k, i + 1);
// 回溯,撤销已经处理过的数字
temp.remove(temp.size() - 1);
}
}
}
剪枝处理后代码
class Solution {
private List<List<Integer>> res = new ArrayList<>();
private List<Integer> temp = new ArrayList<>();
public List<List<Integer>> combine(int n, int k) {
backtracking(n, k, 1);
return res;
}
private void backtracking(int n, int k, int index) {
// 当找到满足条件的组合时, 加入到res中,并返回
if (temp.size() == k) {
res.add(new ArrayList<>(temp));
return;
}
// 在这里可以剪枝优化,当剩下的数字数目不足k个时,没必要列举
for (int i = index; i <= (k - temp.size()) + 1; i ++) {
// 处理一个数字
temp.add(i);
// 开始递归
backtracking(n, k, i + 1);
// 回溯,撤销已经处理过的数字
temp.remove(temp.size() - 1);
}
}
}