JAVA代码编写
77. 组合
给定两个整数 n
和 k
,返回范围 [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
方法一:回溯
思路:
复杂度分析:
- 时间复杂度: 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);}
}