给定两个整数 nk,返回范围 [1, n] 中所有可能的 k 个数的组合。

你可以按 任何顺序 返回答案。

 

示例 1:

输入:n = 4, k = 2
输出:
[
  [2,4],
  [3,4],
  [2,3],
  [1,2],
  [1,3],
  [1,4],
]

示例 2:

输入:n = 1, k = 1
输出:[[1]]

 

提示:

  • 1 <= n <= 20
  • 1 <= k <= n
Related Topics
  • 数组
  • 回溯

  • 👍 696
  • 👎 0
  • 题解

    常规DFS回溯作法,类似的可以参考下LeetCode刷题【47】全排列 II,基本非常雷同

    class Solution {
        List<List<Integer>> arr;
        int k;
        int n;
        Set<Integer> integerSet;
        public List<List<Integer>> combine(int n, int k) {
            arr = new ArrayList<>();
            this.k = k;
            this.n = n;
            integerSet = new HashSet<>();
            dfs(new ArrayList<>());
            return arr;
        }
    
        private void dfs(List<Integer> list){
            if(list.size() == k){
                arr.add(new ArrayList<>(list));
                return;
            }
            int i;
            if (list.size()==0){
                i=1;
            }else{
                i= list.get(list.size()-1) + 1;
            }
            for (; i <= n; i++) {
                if (integerSet.contains(i) ){
                    continue;
                }
                integerSet.add(i);
                list.add(i);
                dfs(list);
                list.remove(list.size()-1);
                integerSet.remove(i);
            }
        }
    
    }