代码随想录算法训练营第24天|77. 组合

JAVA代码编写

77. 组合

给定两个整数 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

教程:https://programmercarl.com/0077.%E7%BB%84%E5%90%88.html#%E5%85%B6%E4%BB%96%E8%AF%AD%E8%A8%80%E7%89%88%E6%9C%AC

方法一:回溯

思路

代码随想录算法训练营第24天|77. 组合_第1张图片

复杂度分析

  • 时间复杂度: O(C(n,k)),其中C(n,k)表示从n个元素中选取k个元素的组合数。
  • 空间复杂度: O(C(n,k)*k)
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

class Solution {
    List<List<Integer>> result = new ArrayList<>();
    LinkedList<Integer> path = new LinkedList<>();

    public List<List<Integer>> combine(int n, int k) {
        backtracking(n,k,1);
        return result;

    }

    public void backtracking(int n, int k, int startIndex){
        if(path.size() == k){
            result.add(new ArrayList<>(path));
            return;
        }
        for(int i = startIndex;i <= n - (k - path.size()) + 1;i++){
            path.add(i);
            backtracking(n,k,i+1);
            path.removeLast();
        }
    }

    public static void main(String[] args) {
        Solution solution = new Solution();
        solution.combine(4,2);
    }
}

你可能感兴趣的:(leetcode,代码随想录,算法,算法,java)