Leetcode日記8

(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)合併左右子鏈表爲一個有序的鏈表。

相關文章
相關標籤/搜索