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 problem freq
66 ~Plus One 2
101 ~Symmetric Tree 2
110 ~Balanced Binary Tree 2
9 ~Palindrome Number 2
35 ~Search Insert Position 2
36 ~Valid Sudoku 2
38 ~Count and Say 2
80 ~Remove Duplicates from Sorted Array II 2
113 ~Path Sum II 2
3 ~Longest Substring Without Repeating Characters 2
11 ~Container With Most Water 2
18 ~4Sum 2
55 ~Jump Game 2
59 ~Spiral Matrix II 2
61 ~Rotate List 2
92 ~Reverse Linked List II 2
5 ~Longest Palindromic Substring 2
25 Reverse Nodes in k-Group 2
37 Sudoku Solver 2
40 Combination Sum II 2
42 Trapping Rain Water 2
45 Jump Game II 2
47 Permutations II 2
48 Rotate Image 2
54 Spiral Matrix 2
68 Text Justification 2
75 Sort Colors 2
76 Minimum Window Substring 2
89 Gray Code 2
90 Subsets II 2
99 Recover Binary Search Tree 2
115 Distinct Subsequences 2
117 Populating Next Right Pointers in Each Node II 2
124 Binary Tree Maximum Path Sum 2
31 Next Permutation 2
41 First Missing Positive 2
84 Largest Rectangle in Histogram 2
87 Scramble String 2
97 Interleaving String 2
# 念念不忘必有迴響 freq
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章