1. 兩數之和
描述:nums = [2, 7, 11, 15], target = 9 傳回[0, 1]
思路:雙指針,一個從前,一個從後。(數組必須排序)
2. 兩數相加
描述:
輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
輸出:7 -> 0 -> 8
原因:342 + 465 = 807
思路:通過最低位開始和進位(init:0)相加。時間複雜度O(max(m,n))
3. 無重複字元的最長字串
描述:
輸入: "abcabcbb"
輸出: 3
解釋: 因為無重複字元的最長子串是 "abc",是以其長度為 3。
思路: 快指針和慢指針,hashmap結構
4. 尋找兩個正序數組的中位數。(放棄)
描述:
nums1 = [1, 2]
nums2 = [3, 4]
則中位數是 (2 + 3)/2 = 2.5
思路:轉換為找第i個小的數,分别找兩個數組的i/2個小的數,比較邊界,動态變換兩個切點的位置。
5. 最長回文子串
描述:
輸入: "babad"
輸出: "bab"
注意: "aba" 也是一個有效答案。
思路:動态規劃。定義狀态變量dp[i][j]為子串i~j是否為回文。dp[i][j]=dp[i+1][j-1] AND i==j?
6. Z字形變換
描述:
輸入: s = "LEETCODEISHIRING", numRows = 4
輸出: "LDREOEIIECIHNTSG"
解釋:
L D R
E O E I I
E C I H N
T S G
思路: 定義numRows數組,來一個字元放入,(放入的時候按照一定規律)
7. 正數反轉
描述:123=>321 -123=> -321 120=>21
思路: 通過相除取餘10,不斷計算累加。
8. 字元串轉換整數
描述: "42"->42 ; " -42"->"-42" ; "words and 987" => "" ; "4193 with words"=>"4193"
思路: 自動機判斷即可
9. 回文數
描述:
輸入: 121
輸出: true
思路:轉變為字元串比較;
10.正規表達式比對
描述: 一定規則的正則比對
思路: 動态規劃

11. 裝最多水的容器。
描述:
輸入:[1,8,6,2,5,4,8,3,7]
輸出:49
思路:雙指針,一個開始,一個尾,開始計算靠緊。
12. 整數轉羅馬數字
描述:
輸入: 1994
輸出: "MCMXCIV"
解釋: M = 1000, CM = 900, XC = 90, IV = 4.
思路:不斷與對應的羅馬數字相減。存儲映射關系。
13. 羅馬數字轉整數:
描述:
輸入: "MCMXCIV"
輸出: 1994
解釋: M = 1000, CM = 900, XC = 90, IV = 4.
思路:計算累加。注意V與VI
14. 最長公共字首
描述:
輸入: ["flower","flow","flight"]
輸出: "fl"
輸入: ["dog","racecar","car"]
輸出: ""
思路:比較即可。
15 . 三數之和
描述:
給定數組 nums = [-1, 0, 1, 2, -1, -4], target=0
滿足要求的三元組集合為:
[
[-1, 0, 1],
[-1, -1, 2]
]
思路: 排序 + 先固定第一個指針,然後雙指針從第二個位置和尾指針周遊。
16. 最接近的三數之和
類比 三數之和
17. 電話号碼的字母組合
描述:
輸入:"23"
輸出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
思路: 回溯+深度優先
18. 四數之和
類比 三數之和 n^3
19. 删除連結清單的倒數第N個節點
描述;
給定一個連結清單: 1->2->3->4->5, 和 n = 2.
當删除了倒數第二個節點後,連結清單變為 1->2->3->5.
思路:時間複雜度)(n),設兩個指針,都從頭開始,第二個指針和第一個距離保持n的長度,當第二個為Null,證明已經到尾了,那麼第一個就在被删除節點的前一個。
20. 有效的括号
描述:
輸入: "()[]{}"
輸出: true
思路: 棧
21. 合并兩個有序連結清單
描述:
輸入:1->2->4, 1->3->4
輸出:1->1->2->3->4->4
思路:合并即可
22. 括号生成
描述:
輸入:n = 3
輸出:[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
思路: 回溯
23 合并K個排序連結清單
描述:
輸入:
[
1->4->5,
1->3->4,
2->6
]
輸出: 1->1->2->3->4->4->5->6
思路:歸并,每2個采用 “ 21. 合并兩個有序連結清單”
24. 兩兩交換連結清單中的節點
描述:給定 1->2->3->4, 傳回 2->1->4->3.
思路:類比下一題
25. K個一組交換
描述:
給你這個連結清單:1->2->3->4->5
當 k = 2 時,應當傳回: 2->1->4->3->5
當 k = 3 時,應當傳回: 3->2->1->4->5
思路:
采用3個指針,一個指head,一個慢慢往後走,另一個是第二個的後一個,逐漸往後修改。到K個後,修改head和end,即end為下一個遞歸的head
26. 删除排序數組中的重複項
描述:
給定數組 nums = [1,1,2],
函數應該傳回新的長度 2, 并且原數組 nums 的前兩個元素被修改為 1, 2。
思路:快指針慢指針。
27. 移除元素
描述:
給定 nums = [3,2,2,3], val = 3,
函數應該傳回新的長度 2, 并且 nums 中的前兩個元素均為 2。
思路:快指針慢指針
28. 實作Strstr()
描述:
輸入: haystack = "hello", needle = "ll"
輸出: 2
思路:KMP (next數組)
29. 兩數相除
描述:
輸入: dividend = 10, divisor = 3
輸出: 3
解釋: 10/3 = truncate(3.33333..) = truncate(3) = 3
思路:被除數翻倍,10能除過3,那麼除6,否則再除12....當除不過的時候再去這個區間劃分。
30. 串聯所有單詞的子串
描述:
輸入:
s = "barfoothefoobarman",
words = ["foo","bar"]
輸出:[0,9]
思路:先把words的單詞和個數放入hashmap,然後通過s的視窗滑動完成搜。(視窗的長度與words字元個數相同,視窗也采用hashmap的統計方式)
31. 下一個排列:
描述:
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1
思路:從大到小排序;從後往前找突然變小的,然後交換此數字和後面比他大的最小的。然後将那個突然變小的後面倒序。(1576432)->将5和6交換(1675432)倒序75432->1623457
32. 最長有效括号:
描述:
輸入: "(()"
輸出: 2
解釋: 最長有效括号子串為 "()"
思路:棧
33. 搜尋旋轉排序數組
描述:
輸入: nums = [4,5,6,7,0,1,2], target = 0
輸出: 4
思路:二分查找。看那一半的兩邊是否遞增。
34. 在排序數組中查找元素的第一個和最後一個位置
描述:
輸入: nums = [5,7,7,8,8,10], target = 8
輸出: [3,4]
思路: 二分
35. 搜尋插入位置
描述:
輸入: [1,3,5,6], 5
輸出: 2
思路:二分
36. 有效的數獨
描述:
數字 1-9 在每一行隻能出現一次。
數字 1-9 在每一列隻能出現一次。
數字 1-9 在每一個以粗實線分隔的 3x3 宮内隻能出現一次。
輸出: true
思路: 從上到下,從左到右,三維數組(第一個是原數組的行,第二個是原數組的列,第三個是所屬的Block,檢測目前block是否已存在已存在的)
37. 解數獨
描述:
數字 1-9 在每一行隻能出現一次。
數字 1-9 在每一列隻能出現一次。
數字 1-9 在每一個以粗實線分隔的 3x3 宮内隻能出現一次。
思路: 回溯(現在[0][2]放1,然後從左往右,發現失敗回溯)
38. 外觀數組。。。。略
39. 組合總和
描述:(允許重複)
輸入: candidates = [2,3,5], target = 8,
所求解集為:
[
[2,2,2,2],
[2,3,3],
[3,5]
]
思路:回溯
40 .組合總和 II
描述:(不允許重複)
candidates = [2,5,2,1,2], target = 5,
所求解集為:
[
[1,2,2],
[5]
]
思路:回溯
41. 缺失的第一個正數
描述:
輸入: [3,4,-1,1]
輸出: 2
思路:創立一個長度為n的數組,周遊一遍,将負數和0扔掉,若目前正數小于n,放在第i位,若大于n,也丢棄。那麼這個數組從頭到尾周遊即可。
42. 接雨水
描述:
思路:棧(當遇到比目前的相等或者高,那麼就可以計算累加了)
43 . 字元串相乘
描述:
輸入: num1 = "123", num2 = "456"
輸出: "56088
思路:普通的乘法。(“3”-“0”=3)
44.通配符比對
描述:
輸入:
s = "cb"
p = "?a"
輸出: false
思路: 通過回溯即可;動态規劃,設定狀态變量dp[i][j]字元串前i個與模式前j個是否比對。
45. 跳躍遊戲2
描述:
輸入: [2,3,1,1,4]
輸出: 2
解釋: 跳到最後一個位置的最小跳躍數是 2。
思路: 動态規劃。初始第一個為2,那麼将dp[1],dp[2]設為1.第二個為3,那麼dp[2]=min(dp[2],dp[1]+1)
46. 全排列
描述:
輸入: [1,2,3]
輸出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
思路:遞歸
47. 全排列 II
描述:(允許輸入的數組中有重複,但是保證輸出不能有重複)
輸入: [1,1,2]
輸出:
[
[1,1,2],
[1,2,1],
[2,1,1]
]
思路:回溯+剪枝
48. 圖像旋轉
描述:
輸入
[
[1,2,3],
[4,5,6],
[7,8,9]
],
輸出
[
[7,4,1],
[8,5,2],
[9,6,3]
]
思路:找規律,1,3,9,7進行變換,然後2,6,8,4...
49. 字母異位詞分組
描述:
輸入: ["eat", "tea", "tan", "ate", "nat", "bat"]
輸出:
[
["ate","eat","tea"],
["nat","tan"],
["bat"]
]
思路: hashmap>
50. pow(x,n)
描述: x的n次方
思路:不斷進行n的除以2的操作,進行x*x或者x*x*y的遞歸操作