1 - 100

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 s
    a 匹配重複 爲上方狀態

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章