Leetcode Freq 4,5

Leetcode Freq 4-5

標籤(空格分隔): leetcode

目錄

20141105:

1. word ladder

  • 爲什麼wordladder用linkedlist來保存distanct?爲什麼要在for loop加distance並enqueue?爲什麼!isEmpty的時候pop出來的distance就是對的。
    • a. ANS: 可以參考Algs Princeton的BFS正確性證明。每次wordQ 在enqueue的時候都是同樣深度的。而且queue的pop(remove and return)保證了distance的正確性。
      eg:ab->aa的最短距離。雖然az的話。loop會把distanceQ+1. 但是不同的word話要pop distance。如果不同的話又返回到aa了。
    • b. 不過還是覺得不太對勁。如果運氣不好一直網az,dz,zz方向走不就成了DFS了?而不是BFS(一層一層的走嗎?).
      ANS:BFS是搜完距離1的繼續搜距離2的。當全部搜完之後call distTo來輸出start到end的最近距離。
  ab
 /   \
aa   az
         \
         dz
           \
           zz

20141103:

0. BFS

  • 聯繫看pseudocode來寫java。比如Wiki page的BFS (link).
  • 還是學習一下regex方便些。因爲Java的replaceall支持regex。而且今天在刪除eclipse裏面的空行也是用的regex: ^\s*\n

1. Word Ladder

  • 怎麼想到本質一個graph的shortest path呢?
    • a. 先是看了yutianzuijin的csdn博客(link)他先是想到2d matrix 然後再想到graph的2種表示方法:
      • 一. adjacent matrix
      • 二.adjacent list. 然後就可以用graph的BFS來解決。但是時間複雜度又太大了,是O(m*dict_size). 其實可以做到O(26*m)
    • b. 魚的(link)講了可以用bi-directional BFS,也可以看作是夾逼方法和k-Sum問題類似。
    • c. n00tc0d3r比較詳細的分析並給出不同解法。而且說了hashset/hashmap在Java和C++裏面的區別:在Java中map快,在C++中set快。

20141102:

finish freq 5

1. set Matrix Zeros.

  • 這又是一道:達到目的可以改變方式。爲了in place.
  • 必須要有2組set來記錄行列爲0的info。既然有matrix給我們。就可以改變它。爲什麼不用第一行列作爲這個row/col set. 當然如果第一行列有zero怎麼回憶起來呢?雖說inplace不能用additional set. 但是flag還是可以的。因爲O(1)=in place。

2. Merge sorted array/list.

複習一下java裏面的lnkedlist和指針了。

20141101:

1. Pow(x,n):

我看了n00tc的答案,他是用n>>1 和 n&1來代替除法和取餘數。但是我直接把pow2的計算換成bit後答案就錯了。爲什麼吶?我測試了一下>>1 跟 &1. 發現如果是正數當然沒問題。但如果是負數則除法跟取模都會得到意外的答案。
1. I got yu shu: 1 vs 1
1. I got remainder: 1 vs 1
2. I got yu shu: -1 vs -2
2. I got remainder: -1 vs 1
注意到N00tc0d3r一開始就把指數n取了絕對值。

2. Validate BST

很好的題目。可以複習到recursion跟iteration的轉化。其實traverse裏面的迭代版本不好想。鄧俊輝的教材分析得很詳細。而且recursion裏面的每個return只是結束當前的stack,從而可以繼續之前保存的stack。覺得CMU-ebiz的答案最好懂。這裏面的lastVisit = root.val放到if(root.val<=lastVisit)之後。這個順序也是一個高潮。要真正理解recursion才能想出來這點。

3. kd-Tree.

  • 參見Coursera Algo4th 的作業五:在一堆點裏面找能用一個unit square抱住的點羣。這就需要用2d tree來search了。link

4. Palindrome

  • 做palindrome之前先看一下java的replaceall用的regex: link
  • 這裏要了解的就是[^a-z], [a-z0-3]的意思。前者是除了a到z以外。後者表示a到z和0到3.所以這裏就是先把輸入的string的非字母數字的字符都換成”“。

5. Valid Number

  • 居然說Valid Number是難度2的題目。。。跪了。第一次面試做compiler的parser就是一個automa。然後不會寫Java的狀態機。這次一定要搞懂。記得moore和mooley FSM最難的就是設計states。就連最簡單的判斷100101都容易寫錯。可以參考這個link看看這個狀態圖是怎麼畫的。N00tc0d3r只給了圖….
  • 注意switch case的格式:要在每個case最後加break或者return。而且case只能是每一個值而不能給範圍。所以a-zA-Z0-9就呆了。還是if else好用些。

6. setMatrixZeros

  • 做setMatrixZeros看到用的hashset,爲什麼呢?hashmap不行嗎?爲什麼用Set<Integer> rows = new HashSet<Integer>();
    然後看到了一片總結:link。
    可以看看我在CS108裏面貼的那個java collection framework關係圖。
    注意在jdk裏面set.class和hashset.class. 前者是interface後者是implementation。

20141030:

0. climb chairs

這題和數硬幣組合類似。不過前者是permutation後者爲combination。

1. 2 sum:

首先把題意搞清楚:
輸入是一組未排序的可重複數組,以及一個目標數。且一組數組只有一組解。求這兩個數的index。

ANS:
一開始想是:

for i: array
     for: j: rest of array
          if (i+j==target)
               return.

但是這樣就會得到O(n^2)!

記得quick sort之類的排序算法是O(nlgn)。可以得到嗎。
唉。想不出來。
看網上答案也就n00tc03r和lexi女的博客有思路分析。還有CMU-ebiz的java整個打包但是答案質量一般。不過也可以看看。programcreek的也很好。

但最主要還是像段公子說的那樣要總結分析出pattern而不是一題一題的解決。這樣永遠會有不會做“新題”的可能。

比如這裏面一般C++的都會用頭尾指針,如CMU的做法。這裏有個分析點很重要:首位指針如果大於target則可以把大的元素永遠排除!也很容易想:因爲這個最大的數加上最小的那個數都超了,那他就不可能和任意其他元素相加得到target。但是小的那個數卻可以保留。因爲他還有機會。這裏和merge 2個排好序的數組要從最後排起。以及刪除一個linked list的node卻只給了前一個pointer一樣。要腦子拐過彎!

所以先寫第二種解法:頭尾指針往中間靠。這樣的時間複雜度是多少呢?
仔細看一下。CC裏面的2sum是return 滿足條件的2個element的值。所以可以用java的sort。
但因爲leetcode是要求index。所以要多一個O(N)空間複雜度來保存index。
九章和CMU_ebiz都給了這個答案。

第三種解法:用hashmap。則可以O(1)+O(n)=O(n)
一個for loop, 搜索map裏面有沒滿足的數,途中把target-input[i] 放到map裏面。
這個最好。用到了java的library。又快又方便啊!而且HashTable解決所有搜索問題啊。

2. 3 sum:

還是要把題目理解:
找到一組未排序的可重複數組裏面的所有 不重複的滿足sum爲0的triplets。
艹,搞了一上午,爲什麼Java ArrayList

3. 3 sum closest

4. 4 sum

5. k-sum.

6.pow(x,n):

先是naive做法。直接循環。但是傻了,忘了負指數是取倒數了。
到了用naive的recursion做法,Programcreek是說:’a recursive solution can easily be written.’。。。好容易弄混。要好好分類。其實就3類,先按N的奇偶正負分,同時和x的正負。而且記住是recursion,所以三個case都是互相調用,每次調用都是pow*pow*pow!而不是pow一次。
但是naive的recursion還是不夠快,而且recursion的重複計算總是不好的。


ID
27 Remove Element 1 4
13 Roman to Integer 2 4
24 Swap Nodes in Pairs 2 4
67 Add Binary 2 4
129 Sum Root to Leaf Numbers 2 4
2 Add Two Numbers 3 4
12 Integer to Roman 3 4
22 Generate Parentheses 3 4
23 Merge k Sorted Lists 3 4
46 Permutations 3 4
49 Anagrams 3 4
77 Combinations 3 4
78 Subsets 3 4
79 Word Search 3 4
91 Decode Ways 3 4
102 Binary Tree Level Order Traversal 3 4
131 Palindrome Partitioning 3 4
69 Sqrt(x) 4 4
1 Two Sum 2 5
8 String to Integer (atoi) 2 5
20 Valid Parentheses 2 5
21 Merge Two Sorted Lists 2 5
65 Valid Number 2 5
70 Climbing Stairs 2 5
88 Merge Sorted Array 2 5
125 Valid Palindrome 2 5
15 3Sum 3 5
50 Pow(x, n) 3 5
73 Set Matrix Zeroes 3 5
98 Validate Binary Search Tree 3 5
127 Word Ladder 3 5
28 Implement strStr() 4 5
56 Merge Intervals 4 5
57 Insert Interval 4 5
ID 念念不忘, 必有迴響
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章