極客算法第一週

1. 兩數之和

方法一:暴力法(兩層循環)時間複雜度:O(n^2) ,空間複雜度O(1)

方法二:兩遍哈希表(第一遍構造哈希表,第二遍找答案),時間複雜度:O(n) 空間複雜度O(n)

方法三:一遍哈希表(最優解)時間複雜度:O(n) ,空間複雜度O(n)

11. 盛最多水的容器

方法一:暴力法(兩層循環)時間複雜度:O(n^2) ,空間複雜度:O(1)

方法二:雙指針法(前後兩個指針向中間移動,最優解)時間複雜度:O(n) ,空間複雜度:O(1)

15. 三數之和

方法一:暴力法(三層循環),時間複雜度:O(n^3) ,空間複雜度:O(1)

方法二:哈希表(排序+兩層循環),時間複雜度:O(n^2) ,空間複雜度:O(1)

方法三:排序+雙指針,時間複雜度:O(n^2) ,空間複雜度:O(1)

21. 合併兩個有序鏈表

方法一:迭代,時間複雜度:O(m+n) ,空間複雜度:O(1)

方法二:遞歸(沒看明白),時間複雜度:O(m+n) ,空間複雜度:O(m+n)

24. 兩兩交換鏈表中的節點

方法一:迭代, 時間複雜度:O(n) ,空間複雜度:O(1)

方法二:遞歸,時間複雜度:O(n) ,空間複雜度:O(n)

25. K 個一組翻轉鏈表

方法一:迭代+就地逆置法, 時間複雜度:O(n) ,空間複雜度:O(1)

方法二:迭代+尾插法, 時間複雜度:O(n) ,空間複雜度:O(1)

方式三:遞歸

26. 刪除排序數組中的重複項

方法一:雙指針, 時間複雜度:O(n) ,空間複雜度:O(1)

66. 加一

  1. 末位無進位,則末位加一即可,因爲末位無進位,前面也不可能產生進位,比如 45 => 46
  2. 末位有進位,在中間位置進位停止,則需要找到進位的典型標誌,即爲當前位 %10後爲 0,則前一位加 1,直到不爲 0 爲止,比如 499 => 500
  3. 末位有進位,並且一直進位到最前方導致結果多出一位,對於這種情況,需要在第 2 種情況遍歷結束的基礎上,進行單獨處理,比如 999 => 1000

時間複雜度:O(n) ,空間複雜度:O(1)

70. 爬樓梯

方法一:暴力遞歸, 時間複雜度:O(2^n) ,空間複雜度:O(n)

方法二:記憶化遞歸,時間複雜度:O(n) ,空間複雜度:O(n)

方法三:動態規劃(dp[i] = dp[i-1]+dp[i-2]),時間複雜度:O(n) ,空間複雜度:O(n)

方法四:斐波那契數列 ,時間複雜度:O(n) ,空間複雜度:O(1)

方法五:Binets 方法(矩陣相乘),時間複雜度:O(logn) ,空間複雜度:O(1)

方法六:斐波那契公式,時間複雜度:O(logn) ,空間複雜度:O(1)

public class Solution {
    public int climbStairs(int n) {
        double sqrt5=Math.sqrt(5);
        double fibn=Math.pow((1+sqrt5)/2,n+1)-Math.pow((1-sqrt5)/2,n+1);
        return (int)(fibn/sqrt5);
    }
}

88. 合併兩個有序數組

方法一:合併排序,時間複雜度:O((m+n)log(m+n)) ,空間複雜度:O(1)

方法二:雙指針從前往後,時間複雜度:O(m+n) ,空間複雜度:O(m)

方法三:雙指針從後往前,時間複雜度:O(m+n) ,空間複雜度:O(1)

141. 環形鏈表

方法一:哈希表(set) ,時間複雜度:O(n) ,空間複雜度:O(n)

方法二:快慢指針,時間複雜度:O(n) ,空間複雜度:O(1)

142. 環形鏈表 II

方法一:哈希表(set) ,時間複雜度:O(n) ,空間複雜度:O(n)

方法二:快慢指針,時間複雜度:O(n) ,空間複雜度:O(1)

189. 旋轉數組

方法一:暴力法(嵌套循環),時間複雜度:O(n*k) ,空間複雜度:O(1)

方法二:使用額外空間存儲旋轉後的數據,時間複雜度:O(n) ,空間複雜度:O(n)

方法三:使用環狀替換(最優解),時間複雜度:O(n) ,空間複雜度:O(1)

方法四:三次反轉,時間複雜度:O(n) ,空間複雜度:O(1)

方法五:Python切片,(nums[:] = nums[n-k:] + nums[:n-k] )

206. 反轉鏈表

方法一:就地逆置法, 時間複雜度:O(n) ,空間複雜度:O(1)

方法二:頭插法, 時間複雜度:O(n) ,空間複雜度:O(1)

方法三:遞歸,時間複雜度:O(n) ,空間複雜度:O(n)

283. 移動零

最優解:雙指針法(快慢指針,慢指針前都是非0,慢指針和當前指針之間都是0),時間複雜度:O(n) ,空間複雜度:O(1)

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