https://leetcode.cn/problems/combinations/description/
给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。
一、回溯
public List<List<Integer>> combine(int n, int k) {
List<List<Integer>> ans = new ArrayList<>();
List<Integer> part = new ArrayList<>();
return getCombByPhase(1, n, k, part, ans);
}
private List<List<Integer>> getCombByPhase(int start, int n, int k, List<Integer> part, List<List<Integer>> ans) {
if (k == 0) {
ans.add(new ArrayList<>(part));
return ans;
}
for (int i = start; i <= n - k + 1; i++) {
part.add(i);
getCombByPhase(i + 1, n, k - 1, part, ans);
part.remove(part.size() - 1);
}
return ans;
}
二、迭代
private List<List<Integer>> combine(int n, int k) {
List<List<Integer>> ans = new ArrayList<>();
List<Integer> part = new ArrayList<>();
// init
for (int i = 0; i < k; i++) {
part.add(0);
}
int i = 0;
while (i >= 0) {
part.set(i, part.get(i) + 1); // 在当前位置+1
if (part.get(i) > n) { // 越界情况,要回退一位,仅回退i。在循环首行,回退的i被重置
i--;
} else if (i == k - 1) { // hit
ans.add(new ArrayList<>(part));
} else { // 不足情况,要进一位。在循环首行,进一位的i被在自己位置上+1。所以设置的时候,用当前位的值设置进一位的值即可
i++;
part.set(i, part.get(i - 1));
}
}
return ans;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。