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);
}
}