(2015/2/3)java
LeetCode 4 Median of Two Sorted Arrays面試
題目大意:找到兩個已排序數組的median。正則表達式
median:中間位置的值。算法
算法:數據庫
參考:https://leetcode.com/discuss/15790/share-my-o-log-min-m-n-solution-with-explanation編程
1)理解什麼是median:數組
1. median將一個集合,分紅兩個相同長度的子集。ide
2.其中一個子集全部的數都大於等於另外一個子集。函數
2)工具
結合題目,將median的兩個條件在程序中表現出來。
3)
使用二分查找,查找知足條件的分割點。
4)
邊界條件的判斷。(保證數組下標的正確性)
5)
注意哪一個數據較長,對計算有影響。
(2015/2/5)
LeetCode 89 Gray Code
題目大意:生成n位格雷碼。
算法:(格雷碼的遞歸生成算法)
1)1位格雷碼有兩個碼字
2)(n+1)位格雷碼中的前2n個碼字等於n位格雷碼的碼字,按順序書寫,加前綴0
3)(n+1)位格雷碼中的後2n個碼字等於n位格雷碼的碼字,按逆序書寫,加前綴1
(2015/2/6)
LeetCode 151 Reverse Words in a String
注意:
1)刪除字符串的前綴空格和後綴空格
2)刪除兩個word之間多於的空格
3)使用string中的erase操做刪除多於的空格。
(2015/2/9)
LeetCode 216 Combination Sum III(多看)
遞歸實現回溯算法。
使用到的C++知識及技巧:
1)vector的back、empty、pop_back等操做。
2)使用一個形參表示餘下還要加上多少數,而不是總數。
(2015/2/16)
LeetCode 230 Kth Smallest Element in a BST
二叉搜索樹的中序遍歷。
(2015/2/18)
LeetCode 39 Combination Sum
回朔法
1)push_back() 和 pop_back()操做要對稱。
LeetCode 40 Combination Sum II
回朔法:同39,加一句判斷跳太重複。
LeetCode 43 Multiply Strings
字符串表示的數字的乘法。
1)
string::find_first_not_of('0'); //找到第一個非'0'的字符。
string::npos //表示不存在的位置。可用於判斷位置是否找到。
string::substr //用於表示string的子字符串。
2)把兩個字符串的下標都表示出來,則能夠清晰地理解其原理。
LeetCode 50 Pow(x, n)
1)使用乘法的結合律,減小乘法的次數。
2)注意處理指數爲INT_MIN的狀況。
(2015/2/19)
LeetCode 54 Spiral Matrix
一步一步走,找到一個座標,插入一個數。
LeetCode 55 Jump Game
1)
參考:https://leetcode.com/discuss/15567/linear-and-simple-solution-in-c
使用兩個下標:一個表示當前位置,一個表示我當前能達到的最遠位置。
2)
使用遞歸遍歷全部的狀況會超時。
(2015/2/24)
LeetCode 181 Employees Earning More Than Their Managers
數據庫:
1)自聯結
2)AND關鍵字
LeetCode 182 Duplicate Emails
1)GROUP BY
2)HAVING
3)COUNT
LeetCode 183 Customers Who Never Order
1)子查詢
2)NOT IN
3)DISTINCT
LeetCode 197 Rising Temperature
1)自聯結
2)DateDiff函數:計算兩個日期之差。
LeetCode 176 Second Highest Salary
參考:https://leetcode.com/discuss/21751/simple-query-which-handles-the-null-situation
1 )MAX函數
2)子查詢
(2015/2/26)
LeetCode 175 Combine Two Tables
1)外部聯結:聯結包含了那些在相關表中沒有關聯的行。
(2015/2/27)
LeetCode 180 Consecutive Numbers
1)聯結3個表
2)使用DISTINCT關鍵字。
(2015/2/28)
LeetCode 309 Best Time to Buy and Sell Stock with Cooldown(多看)
參考:https://leetcode.com/discuss/71354/share-my-thinking-process
動態規劃:
The key for dp is to find the variables to represent the states and deduce the transition function.
1)3種動做:sell、buy、rest
2)以某種動做結束的交易序列的最大利益。
3)方程推導。
4)設計算法時可暫時不考慮時間和空間,編程實現時再考慮就行。
(2015/2/29)
LeetCode 300 Longest Increasing Subsequence(多看)
(OK)參考:http://www.geeksforgeeks.org/longest-monotonically-increasing-subsequence-size-n-log-n/
(超時)參考:http://www.geeksforgeeks.org/dynamic-programming-set-3-longest-increasing-subsequence/
1)遞歸+DP:超時
2)二分查找+一種用數組表示鏈表尾元素的算法。(OK)
LeetCode 64 Minimum Path Sum
由於只能向右和向下走,因此比較簡單。
1)創建一個到每個格子的最小步數的二維數組。
(2015/3/1)
LeetCode 178 Rank Scores
1)外層查詢的表命名爲s
2)子查詢計算名次(與外層查詢進行比較)。
LeetCode 184 Department Highest Salary
1)聯結兩個表,用where子句過濾出同一部門擁有最高工資的是哪些人。
LeetCode 177Nth Highest Salary
1)使用LIMIT限制輸出第幾行後多少個行。
2)注意相同的Salary排名相同。因此要使用DISTINCT;
(2015/3/2)
LeetCode 49 Group Anagrams
本身的方法:
1)計算一個字符串每個字符出現的次數做爲標識。(擊敗2%)
參考別人的方法:(擊敗30%)
1)複製一個vector<string>
2)對副本中的每個string進行排序。排序後的string做爲標識,並保存具備相同string的下標值,來引用未排序的string。
(2015/3/3)
LeetCode 71 Simplify Path
1)把絕對路徑進行分解
"/a/./b/../../c/"能夠分解爲:
"/a"
"/."
"/b"
"/.."
"/.."
"/c"
"/"
2)對各類狀況加以處理便可。
LeetCode 195 Tenth Line
1)awk工具:設計用於數據流。能夠對列和行進行操做。
2)變量NR:表示記錄數量,在執行過程當中對應於當前行號。
LeetCode 63 Unique Paths II
1)創建二維數組
2)若遇到障礙,則到達相應格子的步數爲0。
LeetCode 73 Set Matrix Zeroes
1)O(m + n) space:保存須要清零的行和列。
2)考慮只使用常量空間的算法
(2015/4/16)
200. Number of Islands
1)本身實現的BFS效率較低
2)用 {1, 0} 表示一個vector<int> 對象
(2015/4/17)
130. Surrounded Regions
1)BFS效率較低
(2015/4/18)
279. Perfect Squares
1)遞歸實現dfs
326. Power of Three
判斷一個數是不是3的冪
1)使用對數的方法,當n = 243時出現錯誤。由於double型不精確。
2)能夠使用 3^19 % 3 ^ n == 0
(2015/4/19)
342. Power of Four
判斷一個數是不是4的冪
1)能夠使用對數的方法。
2)不能用 4^15 % 4^n == 0。由於 4^15 % (非4的冪) 也可能 == 0,如2和8。
162. Find Peak Element
1)按順序查找
2)二分查找(較難理解)
240. Search a 2D Matrix II
1)判斷元素是否在某一行,而後進行二分查找。(效率較低)
(2015/4/20)
198. House Robber
參考:http://blog.csdn.net/lu597203933/article/details/44810981
1)動態規劃:
兩個狀態:沒有偷當前房子的最大值;偷了當前房子的最大值。
這兩個狀態的轉移。
172. Factorial Trailing Zeroes
參考:https://leetcode.com/discuss/19847/simple-c-c-solution-with-detailed-explaination
(2015/4/21)
209. Minimum Size Subarray Sum
1)two point
289. Game of Life
題意參考:http://my.oschina.net/Tsybius2014/blog/514447
1)in-place的算法:除了0表示dead、1表示live外添加兩種狀態。10表示live to dead,101表示dead to live。
(2015/4/24)
152. Maximum Product Subarray (多看,理解)
參考:https://leetcode.com/discuss/11923/sharing-my-solution-o-1-space-o-n-running-time
動態規劃:
定義變量:
1)包括當前元素的最大乘積
2)包括當前元素的最小乘積
3)包括前一個元素的最大乘積
4)包括前一個元素的最小乘積
5)當前全局最大乘積
338. Counting Bits
一遍循環完成計算
Hint:
1)You should make use of what you have produced already.
2)Divide the numbers in ranges like [2-3](兩位二進制數), [4-7](3位), [8-15](4位) and so on. And try to generate new range from previous.
計算3位的二進制數包含多少1,只需對1位和2位的相應二進制數加1便可。
例如:
1位 2位 3位
0 10 100
1 11 101
110
111
343. Integer Break
動態規劃:4 = 2 + 2 --> 2 * 2 = 4; 2 = 1 + 1 -- 1 * 1 = 1; 因此 4 不該該是 2 + (1 + 1);
120. Triangle
動態規劃:到達某層某個數的最短距離是,他上一層相鄰的兩個數中較小的,加上這個數。
(2015/4/29)
221. Maximal Square
參考:https://leetcode.com/discuss/38489/easy-solution-with-detailed-explanations-8ms-time-and-space
1)動態規劃的關鍵:找到狀態方程
2)定義狀態:the maximal size of the square that can be achieved at point (i, j), denoted as P[i][j]
3)狀態轉換方程:分別對第一行、第一列、其餘下標定義狀態轉換方程。轉移方程根據矩陣中爲‘0’或‘1’而定。
304. Range Sum Query 2D - Immutable
1)較簡單。
(2015/5/4)
213. House Robber II
根據是否選擇最後一個房間,把問題轉化爲House Robber I的狀況。
91. Decode Ways
考慮是否全面。什麼狀況下無解。不一樣位置上的0的狀況。
(2015/5/6)
264. Ugly Number II
動態規劃:每次添加一個ugly number,添加哪個?
(2015/5/10)
347. Top K Frequent Elements
使用multimap
(2015/5/13)
227. Basic Calculator II
1)使用隊列
345. Reverse Vowels of a String
1)two point
(2015/5/17)
93. Restore IP Addresses
深度優先遍歷+剪枝
string:substr(起點,長度)
(2015/5/20)
47. Permutations II
與Permutations I類似:用字典序法計算全排列。
1)對nums排序,獲得字典序中的第一個字符串。
2)從排列的右端開始,找出第一個比右邊數字小的數字。序號記爲a。
3)在序號爲a的右邊的數字中,找出全部比nums[a]大的數中最小的數字。序號記爲b。(此過程對nums中元素是否重複,無影響)
4)對換nums[a]和nums[b]。
5)對nums[a + 1]到最後的元素排序。
(2015/5/29)
10. Regular Expression Matching 正則表達式匹配
參考:https://leetcode.com/discuss/9405/the-shortest-ac-code
1)子函數:匹配兩個字符串的第一個字符
2)遞歸
(2016/6/11)
77. Combinations
78. Subsets
79. Word Search
(2016/6/16)
80. Remove Duplicates from Sorted Array II
1)two pointers
2)in place
(2016/6/17)
33. Search in Rotated Sorted Array 旋轉數組中查找一個元素
二分查找,注意區分元素可能出如今哪一段。
(2016/6/19)
81. Search in Rotated Sorted Array II
在33題的基礎上,添加相等的判斷。若相等則掃描。
(2016/6/20)
82 Remove Duplicates from Sorted List II
用三個指針
86. Partition List
思路:遍歷,找到一個比x小的節點,改變此節點在鏈表中的位置
用3個指針
1)一個表示比x小的最後一個節點,以後比x小的節點在此節點後插入
2)一個用於尋找比x小的節點,一個是此節點的前驅
349. Intersection of Two Arrays
(2016/6/21)
90. Subsets II (想不到)
參考:https://leetcode.com/discuss/34975/accepted-solution-backtracking-only-lines-easy-understand
1)回溯法
2)遞歸
92. Reverse Linked List II
本身構造測試用例,以完善代碼。
131. Palindrome Partitioning
回溯法:彈進,彈出
(2016/6/22)
109. Convert Sorted List to Binary Search Tree
遞歸
129. Sum Root to Leaf Numbers
二叉樹的先序遍歷
(2016/6/23)
134. Gas Station(不會)
參考:https://leetcode.com/discuss/4159/share-some-of-my-ideas
(2016/6/24)
142. Linked List Cycle II
參考:《劍指offer記念版》面試題56
139. Word Break(多理解)
參考:https://leetcode.com/discuss/18904/java-implementation-using-dp-in-two-ways(20ms)
參考:https://leetcode.com/discuss/21709/dynamic-programming-simple-fast-solution-with-optimization(4ms,一樣的算法,遍歷順序相反)
(2016/6/26)
143. Reorder List
分3步作
(2016/6/27)
147. Insertion Sort List
用插入排序來排序鏈表
(2016/6/29)
148. Sort List
鏈表的歸併排序算法。
1)如何找到鏈表的中點?使用快慢指針,一個指針走1步,一個指針走兩步,當快指針到達終點時,慢指針到達鏈表的中點。
2)遞歸實現歸併排序。
3)歸併排序的思想:1)將所要排序的鏈表分爲長度相同的兩個子鏈表,2)分別對左右子鏈表進行歸併排序,3)合併左右子鏈表爲一個有序的鏈表。