77.组合(简单)

给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。

示例:

输入: n = 4, k = 2
输出:

1
2
3
4
5
6
7
8
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/combinations

思路:

回溯

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Solution {
public List<List<Integer>> combine(int n, int k) {
List<List<Integer>> ans = new ArrayList<>();
dfs(new ArrayList<>(),ans,1,n,k);
return ans;
}

void dfs(List<Integer> list,List<List<Integer>> ans,int start,int n,int k){
if(k==0){
ans.add(new ArrayList<>(list));
return ;
}
for(int i=start;i<=n-k+1;i++){
list.add(i);
dfs(list,ans,i+1,n,k-1);
list.remove(list.size()-1);
}
}
}

新代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution {
List<List<Integer>> res = new ArrayList<>();
List<Integer> list = new ArrayList<>();
public List<List<Integer>> combine(int n, int k) {
backtrack(n,k,1);
return res;
}
//start用来标识在本层递归中从哪开始
public void backtrack(int n,int k,int start){
//终止条件
if(list.size()==k){
res.add(new ArrayList<>(list));
return;
}
for(int i = start;i<=n;i++){
//回溯
list.add(i);
backtrack(n,k,i+1);
list.remove(list.size()-1);
}
}
}