26. 刪除有序數組中的重複項
後面的數等於前面的就continue,不等就賦給pre,pre++
25. K 個一組翻轉鏈表
迭代
24. 兩兩交換鏈表中的節點
迭代/遞歸
23. 合併K個升序鏈表
思路1
按合併兩個有序鏈表一輪一輪比對
思路2
將合併兩個有序鏈表作爲方法,順序merge
思路3
兩兩合併 logK的方法,仔細處理n對摺。
22. 括號生成
思路
- 使用dfs生成。
注意的點
- 結束條件寫在最前面
- 接下來是剪枝條件
- 左括號和右括號順序if。注意參數不能上下影響
21. 合併兩個有序鏈表
思路
- 簡單題,正常思路下來就可
18. 四數之和
思路
- 三數之和再加一層for循環,使用continue處理前兩個循環的重複問題,使用whle處理left right 重複問題,最後記得left++ right--
17. 電話號碼的字母組合
思路1
- 使用map,遞歸傳入str,以(“”,0)開始。index == digits.size()結束。
思路2
- map存數字和字符串的pair,將一個數字的字符串全push,通過q.size()確定循環次數
14. 最長公共前綴
思路1 橫向比對
比對相鄰兩個單詞的各個字符,截取最長公共前綴與接下來那個比。(感覺可以用遞歸來做)
思路2 縱向比對
比對字符串數組中各個單詞的第一個第二個……字符,直到某一位不同
面試題 17.21. 直方圖的水量
思路1
- 動態規劃,左值,dp1存左側往右能接的水量,右值,dp2存右側往左能接的水量。取dp1.dp2的最小值爲該下標的真實水量
思路2
- 單調棧,
15. 三數之和
思路
- 排序定第一個i,後面使用
left
right
移動雙指針判斷和是否爲0
值得注意的地方
- 在去重問題上把邊界條件放在
nums[left] = nums[left + 1]
前 - 把去重移動放在達成
==0
條件的那個區域裏
13. 羅馬數字轉整數
我的思路
- 用一個hashmap保存每一種羅馬數和整數的對,在一次循環中查找是兩個還是一個。優先查兩個的。然後再把對應數相加。
改進思路
- 依然是使用哈希表,爲了解決條件判斷語句(兩個還是一個的問題),將
s
中的兩位羅馬數字替換("IV"換成"a"等等).
大佬思路
- 把一個小值例如
I
放在大值V
的左邊,就是做減法,否則爲加法.另外,把由羅馬數字獲取數字封裝爲一個函數,使用switch.
12. 整數轉羅馬數字
思路
- 對羅馬數編碼,貪心減去最大的數。能減完1000就減完1000再減900.
11. 盛最多水的容器
難點
- 使用雙指針,長邊縮進只會減少蓄水的容量,只有短邊縮進(替換爲長邊)纔會有可能增加容量。所以只要嘗試縮進短邊使用max就可
10. 正則表達式匹配
思路
-
*
字符後的匹配情況分析
1)sa s*a 匹配對角線
2)s a 匹配0個 爲左側狀態
3)saa sa 匹配重複 爲上方狀態
9. 迴文數
思路1
- 左右向中間移位1,比較每一位是否相等。(需要求解位數)
思路2
- 將原數組後半部分模擬成前半部分,處理一半長度。
6. Z 字形變換
我的思路
- 使用數學方法,將每一行與首列及numsrow的關係列清楚,再按行計算。
題解思路
- 使用string列表記錄每一行的str,使用flag控制列表下標的方向轉換。
5. 最長迴文子串
思路1
- 動態規劃,轉移方程:
dp[i][j] = (s[i] == s[j]) && ((j - i) < 3 || dp[i + 1][j - 1])
思路2
- 使用中心擴散的方法,針對迴文串爲奇數或偶數,基於
(i,i)和(i, i + 1)
向兩邊擴散
4. 尋找兩個正序數組的中位數
思路1
- 比較兩個正序數組中下標爲
[index + k / 2 - 1]
的元素大小,去除較小元素及其左側元素,以k / 2
的速度接近中位數
這個方法可以用於獲得兩個正序數組中第k個元素
需要注意的地方
-
k
代表個數,而非下標 - 使用左側向右延展
k / 2
的方式,注意越界情況
思路2
- 中位數滿足條件——一條割線的兩側滿足交叉小於等於&& 左側元素個數==右側元素個數(+1 分奇偶)
有時間複雜度O(log min(m,n)),在較短的那個數組上進行二分查找。
1. 兩數之和
思路:哈希表
使用哈希表記錄需要匹配的數和數組下標
2. 兩數相加
難點:
- 使用
l1 || l2 || add
作爲循環條件,在循環裏判斷鏈表是否爲空
3. 無重複字符的最長子串
思路:滑動窗口
取一個遍歷的右指針,一個位於重複元素右側第一位的左指針,求兩指針之間的最大值。
難點
1.如何記錄重複字符?
- 使用字符哈希數組記錄字符的下標,未重複使用-1作爲val
2.如何找到重複元素的下標?
- 使用字符哈希數組與left值作比較,大於等於left值則重複了,被記錄了一次過了。
3.使用下標作爲val而非(0/1)確定是否重複,免去了查找重複元素的過程。
知識點:
1.字符哈希數組的使用
2.memset
4. 尋找兩個正序數組的中位數
1.拼接兩個數組並找到中位數
相關題目:
35.二分搜索
7. 整數反轉
難點
如何判斷溢出情況?
- 輸入是十進制的數,所以需滿足兩個判斷條件
1.最後一輪是否大於INT_MAX / 10
或者小於INT_MIN / 10
2.在等於的情況下,需要判斷最後一位 - 過程是在單while循環中實時模擬的方法
需要解釋的地方
討論一下輸入的第一位
以256爲例
輸入反轉後的257/258/259都是溢出的,但是752、852、952均不可能作爲輸入(>256),所以不需要判斷等於的情況
以856爲例
輸入反轉後的857/858/859均是溢出的,且758可以作爲輸入(<856),所以要討論758這個數的第一位(while的最後一次循環)是否大於MAX的最後一位6