To generate all combinations of k numbers from 1 to n, we can use backtracking to build each combination step by step, exploring all possible choices at each step.
classSolution {
public List<List<Integer>>combine(int n, int k) {
List<List<Integer>> ans =new ArrayList<>();
List<Integer> cur =new ArrayList<>();
dfs(1, n, k, cur, ans);
return ans;
}
privatevoiddfs(int start, int n, int k, List<Integer> cur, List<List<Integer>> ans) {
if (cur.size() == k) {
ans.add(new ArrayList<>(cur));
return;
}
for (int i = start; i <= n; i++) {
cur.add(i);
dfs(i+1, n, k, cur, ans);
cur.remove(cur.size()-1);
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
classSolution {
funcombine(n: Int, k: Int): List<List<Int>> {
val ans = mutableListOf<List<Int>>()
val cur = mutableListOf<Int>()
fundfs(start: Int) {
if (cur.size == k) {
ans.add(cur.toList())
return }
for (i in start..n) {
cur.add(i)
dfs(i+1)
cur.removeAt(cur.size-1)
}
}
dfs(1)
return ans
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
classSolution:
defcombine(self, n: int, k: int) -> list[list[int]]:
ans = []
cur = []
defdfs(start: int):
if len(cur) == k:
ans.append(cur[:])
returnfor i in range(start, n+1):
cur.append(i)
dfs(i+1)
cur.pop()
dfs(1)
return ans
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
impl Solution {
pubfncombine(n: i32, k: i32) -> Vec<Vec<i32>> {
fndfs(n: i32, k: i32, start: i32, cur: &mut Vec<i32>, ans: &mut Vec<Vec<i32>>) {
if cur.len() == k asusize {
ans.push(cur.clone());
return;
}
for i in start..=n {
cur.push(i);
dfs(n, k, i+1, cur, ans);
cur.pop();
}
}
letmut ans =vec![];
letmut cur =vec![];
dfs(n, k, 1, &mut cur, &mut ans);
ans
}
}