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的最近距離。
- a. ANS: 可以參考Algs Princeton的BFS正確性證明。每次wordQ 在enqueue的時候都是同樣深度的。而且queue的pop(remove and return)保證了distance的正確性。
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快。
- a. 先是看了yutianzuijin的csdn博客(link)他先是想到2d matrix 然後再想到graph的2種表示方法:
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 | 念念不忘, 必有迴響 |