DFS 总结

  1. Subsets I, II //done
  2. Combinations//done
  3. Permutations I, II (可先不做)//done
  4. Combination Sum I, II (可先不做)

  1. Generate Parentheses //done
  2. Palindrome Partitioning
  3. Letter Combination of a Phone Number
  4. Restore IP Address

  1. Word Search 
  2. Surrounded Regions
  3. N-Queens I, II
  4. 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 怎么画树状图?


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值