解法一:回溯

可以加上剪枝操作,会更快。

  1. import java.util.ArrayList;
  2. import java.util.Arrays;
  3. import java.util.LinkedList;
  4. import java.util.List;
  5. import java.util.Collections;
  6. class Solution {
  7. List<List<Integer>> ans;
  8. Integer[] nums;
  9. public List<List<Integer>> combine(int n, int k) {
  10. ans = new LinkedList<>();
  11. nums = new Integer[k];
  12. build(n, k, 0, 1);
  13. return ans;
  14. }
  15. private void build(int n, int k, int index, int start) {
  16. // 剪枝, 保证剩下可选的数必须多于待选的数量
  17. if (n - start + 1 < k - index) {
  18. return;
  19. }
  20. if (index == k) {
  21. List<Integer> temp = new ArrayList<>(k);
  22. Collections.addAll(temp, nums);
  23. ans.add(temp);
  24. return;
  25. }
  26. for (int i = start; i <= n; ++i) {
  27. nums[index] = i;
  28. build(n, k, index + 1, i + 1);
  29. }
  30. }
  31. }