题目描述
给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。
你可以按 任何顺序 返回答案。
输入:n = 4, k = 2
输出:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]
考察点
回溯
第二次:2022年12月16日09:11:48
也是慢慢的做出来了 ,可喜可贺!
代码展示
class Solution {
List<List<Integer>> list = new ArrayList<>();
List<Integer> path = new ArrayList<>();
private void dfs(int n, int k, int m) {
if (path.size() == k) {
list.add(new ArrayList<>(path));
// list.add(path);
return;
}
for (int i = m; i <= n; i++) {
path.add(m);
System.out.println("递归之前 => " + path);
dfs(n, k, ++m);
path.remove(path.size() - 1);
System.out.println("递归之后 => " + path);
}
}
public List<List<Integer>> combine(int n, int k) {
dfs(n, k, 1);
return list;
}
public static void main(String[] args) {
Solution solution = new Solution();
List<List<Integer>> combines = solution.combine(4, 2);
System.out.println("==================");
for (List<Integer> combine : combines) {
for (int i = 0; i < combine.size(); i++) {
System.out.print(combine.get(i) + "\t");
}
System.out.println();
}
}
/**
* @Result:
* 执行耗时:18 ms,击败了25.37% 的Java用户
* 内存消耗:42.7 MB,击败了56.04% 的Java用户
*
*/
}
说明点
list.add(new ArrayList<>(path));
// list.add(path);
因为直接加入path后,后续对path进行修改的话,result里相应的部分也会被修改掉。
所以,一定要新建一个ArrayList (地址不同),不然result里每一个ArrayList 地址都是同一个。也就是值相同的。
优化点
可以对回溯算法进行减枝操作:
/**
* @Result:
* 执行耗时:2 ms,击败了69.83% 的Java用户
* 内存消耗:42.5 MB,击败了85.18% 的Java用户
*
* 2022/12/16 11:05
*/