解法一:回溯
可以加上剪枝操作,会更快。
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);}}}
