Leetcode Freq 2

Leetcode Freq 2

标签(空格分隔): leetcode


20141228

Populating Next Right Pointers in Each Node II

Binary Tree Maximum Path Sum

Next Permutation

First Missing Positive

Largest Rectangle in Histogram

Scramble String

Interleaving String

20141226

Reverse Nodes in k-Group

Trapping Rain Water

Permutations II

Rotate Image

Text Justification

Sort Colors

Minimum Window Substring

Gray Code

Subsets II

20141225

Path Sum I/II

  • 树的题目很常见, 但是方法都类似: recursion.
  • 问题也很常见: I一般就是问是否存在解. II一般是求所有解的集合.
  • 正是这道题目, N00t讲了Java的call by value对于object来说是copy他的handler, 即reference, 所以将来的改变会对之前add的reference改变, 也就改变了最终的结果:

    • Notice that we make a copy of the path before we added it to our result set. The reason is that when we add an Object (here, an ArrayList), Java add a copy of the pointer (i.e. a reference) of the Object, rather than a deep copy. So, any changes to content of the original Object will reflect into our final result set.
  • 同样的Ganker也是res.add(new ArrayList<Integer>(item));. 否则必然是错误的.

  • 为什么N00t的if (root.value==sum)里面放path到res之后不能return, 否则会出现错误的path? 因为这个里面加上return是完全错误的! 这里并不是base case, 不应该return. 但是Ganker的为什么又应该加上return呢? 因为这个是base case. 注意Ganker的顺序.

Longest Substring Without Repeating Characters

  • N00t的方法是hashmap+start/end2个pointer的移动, 注意N00t只要判断当前的char是不是在当前substring中, 才update. 考虑到返回所有这种substring的问题. 我的思路是记录longest的start, 这样因为maxlength是返回值. 所以substring就可以解决. 但是有点小问题.
  • Ganker则是使用的walker/runner 双指针法. 或者说: 窗口法来处理这一类的string问题. 还归了类. 一开始没理解为什么是while(charAt(w)!=charAt(r)). 想到了一个好例子: “xyb12b02”. 走了一遍理解了. 本来给的例子: “abcabcbb”并不好. 因为W=R都是连续的, 没看到while不等的情况. 所以有时候要多举几个case. 但不是随便举. 而是想上面那个case那样第一个重复的’b’并不是第一个字母.
    • 扩展的题目有Substring with Concatenation of All Words,Minimum Window Substring,思路是非常接近的,只是操作上会更加繁琐一些。
  • case很重要, 一是在开始做题之前用来理解, 考虑算法之用. 二来是作为test case. 但是case也要设计得好才行, 不然还是会错. 所以要建立在完全理解题意, 想好算法之后写有用的case, 来改正算法. 有点鸡生蛋, 但实际上是要懂了再下笔. 面试不是调代码.

Longest Consecutive int string

  • 这道题在GoPro onsite面到. 其实很简单的recursion. 题目意思是给一个排好序的string: “abccdeeeeef”, 则’e’是重复次数最多, 有5次. 所以返回: e和5. 其实这个和compression很相同, 之前见过: 将这个string输出为”a1b1c2d1e5f1”
  • 思路参考的SOF上面的recursion.

Container With Most Water

Jump Game

  • 经典的DP和Greedy问题. 段公子在DP/recursion里面讲了.
  • 第二题的想法在N00t和Ganker之间有区别. 可以加深理解. 也确实想了好久才明白他们的code.
  • Ganker的评论里面又一个记录path的方法, 这样可以返回最少jump的path. 总而言之, 也是一个DP的方法. DP还是Greedy? 傻傻分不清. 还要回头复习一下贪新算法: MST.

3Sum/4Sum

  • 主要参考N00t和Ganker的解法. 但其实可以结合HashSet来做4Sum. 更简单.
  • 注意这里面的设计, 如何避免重复. 所以要sort. 通常的解法是夹逼法则. for loop循环3-2或者4-2个头, 然后剩下2个index可以用left/right来夹逼.
  • 注意这里正确的使用了do…while.
  • Binary search的合理使用. 一般不会直接写一个binary search. 但是这里夹逼自然是binary search好用. O(n)->O(lgn)

Spiral Matrix I/II

  • N00t的这张图真是经典, 也确实是复杂题目想好psuedo code才写!
  • *

Recover Binary Search Tree

  • 再次加深了对Recursion的理解. 2个不连续的recursion. 而且param还不对称, N00t的recursion写的真好. N00t的方法也很好.

Distinct Subsequences

+When you see string problem that is about subsequence or matching, dynamic programming method should come to your mind naturally. —by link

  • DP的经典题目. N00t的做法也是可以的. 但我倾向于Ganker/SophieJ. 但是要理解DP公式的含义. 不然连边界条件或者初始条件都搞不出来. Ganker的2D分析, 然后code则是优化为1D dp的解法一开始没看懂, 然后Ganker在回复里面解释了为什么j是从T的后面往前扫. 这是因为这里的DP是想使用update之前的值, 所以这样. 如果以后有个DP问题是要使用更新后的1D dp, 则是从头往后扫.
  • 还是的加深理解为什么1D的逆向填的DP是对的? 会不会导致比较出来的subsequence没按顺序? 或者反过来了? 见csdn link 有点乱: 下标, 如何保证是in-order? 看Coin Change—段公子.

20141223

Plus One

  • 这是一道简单题. N00t给出了他的扩展题: plus int.
  • Ganker说他在Google店面的时候就问了这题. 因为适合扩展和OOD的设计.

Symmetric Tree

  • Ganker是简单的recursion和iteration. 注意这里判断是否对称的条件: 空的情况, 有值的情况. 注意不用判断值相等. 为什么? 因为helper是recursion, 要找到结束得点. 而值相等可以继续走下去. 而都为空就可以直接返回true. 因为走不下去了. 这里也明显的看出iteration为什么会繁琐.
  • N00t使用的一种stl数据结构: ArrayDeque. 其他思路和Ganker是一样的.

Balanced Binary Tree

Palindrome Number

  • 和Freq3的PalindromeDPDP类似.
  • 这里的比较2end不能用pointer了. 因为不是string. 这里有2个方法. 用一个div(不断变化). 本质还是loop里面update为指向对称的end points.
  • 或者是1337里面的第三个方法: 用一个stack.

Search Insert Position

  • 在freq3里面已经做过

Valid Sudoku

  • 巧妙使用i/3*3i%3*3. 以及API的设计

SOlve Sudoku

  • 加深理解循环递归. 觉得比NP的N-Queens更重要. 这里的设计是很重要的模版.

Count and Say

Remove Duplicates from Sorted Array I/II

  • 好在我回顾了这道题目. 发现N00t的思路太不好了, 很容易错, 而且扩展不了. 实际上有string, 有比较的时候就用pointer就好了. 而且这里还是in-place. 就算是II, 也只要多加一个变量cnt来看当前有几次重复元素.
  • 所以Ganker的方法远胜于N00t. 也保证了这种简单题目的清晰思路和bug-free. 就是通过

题目

#Leetcode problemfreq
66~Plus One2
101~Symmetric Tree2
110~Balanced Binary Tree2
9~Palindrome Number2
35~Search Insert Position2
36~Valid Sudoku2
38~Count and Say2
80~Remove Duplicates from Sorted Array II2
113~Path Sum II2
3~Longest Substring Without Repeating Characters2
11~Container With Most Water2
18~4Sum2
55~Jump Game2
59~Spiral Matrix II2
61~Rotate List2
92~Reverse Linked List II2
5~Longest Palindromic Substring2
25Reverse Nodes in k-Group2
37Sudoku Solver2
40Combination Sum II2
42Trapping Rain Water2
45Jump Game II2
47Permutations II2
48Rotate Image2
54Spiral Matrix2
68Text Justification2
75Sort Colors2
76Minimum Window Substring2
89Gray Code2
90Subsets II2
99Recover Binary Search Tree2
115Distinct Subsequences2
117Populating Next Right Pointers in Each Node II2
124Binary Tree Maximum Path Sum2
31Next Permutation2
41First Missing Positive2
84Largest Rectangle in Histogram2
87Scramble String2
97Interleaving String2
#念念不忘必有回响freq
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值