给定两个整数 n
和 k
,返回范围 [1, n]
中所有可能的 k
个数的组合。
你可以按 任何顺序 返回答案。
本题还是经典回溯题,根据代码会想路总结,回溯算法一般分为五个问题:
那么本题是经典的组合问题,那么回溯问题一般都有这样的伪代码:
void backtracking(参数) {
if (终止条件) {
存放结果;
return;
}
for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
处理节点;
backtracking(路径,选择列表); // 递归
回溯,撤销处理结果
}
}
那么怎么将这段代码代入到本题呢。
import java.util.ArrayList;
import java.util.List;
public class no_77 {
public static void main(String[] args) {
List<List<Integer>> combine = combine(4, 2);
for (List<Integer> in : combine) {
for (int i = 0; i < in.size(); i++) {
System.out.print(in.get(i) + " ");
}
System.out.println();
}
}
public static List<List<Integer>> combine(int n, int k) {
List<List<Integer>> re = new ArrayList<>();
backTrack(re, new ArrayList<>(), 1, n, k);
return re;
}
public static void backTrack(List<List<Integer>> re, List<Integer> currentCombination, int start, int n, int k) {
if (currentCombination.size() == k) {
re.add(new ArrayList<>(currentCombination));
return;
}
for (int i = start; i <= n; i++) {
currentCombination.add(i);
backTrack(re, currentCombination, i + 1, n, k);
currentCombination.remove(currentCombination.size() - 1);
}
}
}