- Subsets I, II //done
- Combinations//done
- Permutations I, II (可先不做)//done
- Combination Sum I, II (可先不做)
- Generate Parentheses //done
- Palindrome Partitioning
- Letter Combination of a Phone Number
- Restore IP Address
- Word Search
- Surrounded Regions
- N-Queens I, II
- Sudoku Solver (频率= 2, 有时间再做)
总结:
1 Subsets 和 Combinations 很像。都有这个结构:
dfs(int n, int start, ArrayList<Integer> item, ArrayList<ArrayList<Integer> result){
for(int i = start; i <=n; i++){
item.add(i);
dfs(n, i+1, item, result);
item.remove(item.size()-1);
}
}
区别仅在于:
Subsets对每个路径上的item都加入result,而Combinations当且仅当item.size()==k 时,把item加入result
WordBreak II 也有这个结构。但没有最后一步的item.remove.是因为String的值不会在下层调用后被改变。
2 Subets, Permutations把DFS的过程用树表示出来,它们的回溯过程都向上退两层。而Combinations只用退一层。这是因为前两者是严格的DFS,必须走到底;而Combinations不需要走到底,只要满足item里面有k个,就可以退出了。(对C(n, n)这种情况才需要走到底)
3 Permutations 和Combinations的共同点是:base case 是 item.size() == num.length (item.size()==k)
4 Permutations 和Subsets, Combinations的区别是:Permutations需要建一个boolean 数组,记录哪些元素用过。只要没用过就可以用,而不用像Subsets, Combinations那样只能往后加。
for(int i = 0; i <=n; i++)//Permutations
而不是
for(int i = start; i <=n; i++)//Subsets, Combinations
5 Permutations II 记住要先排序,才能把相同的元素排在一起。
问题:
1 Combinations 中, 当item.size() == k时,可以不加return 吗?(也可以过OJ, 为什么?)
2 Subsets II 为了去掉重复元素用了while, 但Permutations II 用if, 为什么不同?
3 Generate Parentheses 怎么画树状图?