解法一:回溯
可以加上剪枝操作,会更快。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.Collections;
class Solution {
List<List<Integer>> ans;
Integer[] nums;
public List<List<Integer>> combine(int n, int k) {
ans = new LinkedList<>();
nums = new Integer[k];
build(n, k, 0, 1);
return ans;
}
private void build(int n, int k, int index, int start) {
// 剪枝, 保证剩下可选的数必须多于待选的数量
if (n - start + 1 < k - index) {
return;
}
if (index == k) {
List<Integer> temp = new ArrayList<>(k);
Collections.addAll(temp, nums);
ans.add(temp);
return;
}
for (int i = start; i <= n; ++i) {
nums[index] = i;
build(n, k, index + 1, i + 1);
}
}
}