leetcode77_组合
我一开始的写法:
class Solution {
private List<List<Integer>> ans = new ArrayList();
private List<Integer> list = new ArrayList();
private void backtracking(int n, int k, int depth, boolean[] used) {
if(depth == k) {
System.out.println(depth);
System.out.println(list);
ans.add(list);
return;
}
for(int i = 1; i <= n; i++) {
if(!used[i]) {
used[i] = true;
list.add(i);
depth += 1;
backtracking(n, k, depth, used);
depth -=1;
list.remove(list.size()-1);
used[i] = false;
}
}
}
public List<List<Integer>> combine(int n, int k) {
boolean[] used = new boolean[n+1];
backtracking(n, k, 0, used);
return ans;
}
}
最大的问题出现对java语法的问题:
class Solution {
private List<List<Integer>> ans = new ArrayList();
private List<Integer> list = new ArrayList();
private void backtracking(int n, int k, int startIdx) {
if(list.size() == k) {
ans.add(new ArrayList<>(list));
return;
}
for(int i = startIdx; i <= n-(k-list.size())+1; i++) {
list.add(i);
backtracking(n, k, i+1);
list.remove(list.size()-1);
}
return;
}
public List<List<Integer>> combine(int n, int k) {
backtracking(n, k, 1);
return ans;
}
}
对于一个外部的ArrayList,你必须要新new一个ArrayList插入进去,不能直接把现有的ArrayList插入。因为你是引入传递,存入只是地址,当它清空之后自然也就清空了。
// 一个n叉树的遍历你都写不出来?垃圾!
// k控制的是深度,n控制的是宽度
// 深度不应该是由循环来控制的,应该是用遍历的深度来控制的,也就是回溯函数中不会写到对深度的循环