LeetCode #128 Longest Consecutive Sequence - 刷題之旅
1 題目描述
給一個數組,求連續的數字最多有多少個,這邊特特書挑站是 時間複雜度要求是 O(n)。
2 解法
2.1 我的解法
一開始想說把 nums 放進去 Set 裡面,他是會有一個順序的,但並不會從小排到大,所以後來才硬是把他排序過後再比較。
使用 set 的好處是可以把重複的數字過濾掉,這樣就不用擔心重複的數字會影響到我們的計算。
大概是這樣的感覺:
1 | class Solution: |
時間複雜度O(nlogn)
- 建立 nums_sets 集合的時間複雜度是 O(n)。
- 排序 nums_sets 集合的時間複雜度是 O(nlogn)。
- 進行 while 循環的時間複雜度是 O(n)。
- 因此 總的時間複雜度是 O(nlogn)。
空間複雜度O(n)
- 建立 nums_sets 集合的空間複雜度是 O(n)。
- 排序 nums_sets 集合的空間複雜度是 O(n)。
- 因此 總的時間複雜度是 O(n)。
但是這個做法最大的問題是 sorted
的時間複雜度是 O(nlogn),所以這個解法是不合格的。
2.2 改良
上面的做法最大的問題是,需要排序,為什麼要排序的原因是,這樣就可以專心地往一個方向找,但是這樣的時間複雜度是 O(nlogn) 是不符合題目要求的。
如果我們不排序,那就變成左右兩個方向都要同時找,慢慢擴大範圍,我們不確定抓的第一個數字是否在 nums 中為最小,假設他是中間的數值好了,我們就要往左右兩邊找,看看可以找到多少連續的數字。在找的時候,我們可以把找過的數字從 nums_sets 中刪除,這樣當發生斷掉的狀況時,可以從剩下的 nums_sets 隨便挑一個,繼續開始往左右兩邊找。
實際帶入數字大概是這樣的感覺:
1 | class Solution: |
時間複雜度O(n)
- 建立 nums_sets 集合的時間複雜度是 O(n)。
- 儘管 while 裡面有 while ,但是因為每次都會把找過的數字從 nums_sets 中刪除,所以最每個數值只會被 遍歷一次,因此時間複雜度為 O(n)。
- 因此 總的時間複雜度是 O(n)。
空間複雜度O(n)
- 建立 nums_sets 集合的空間複雜度是 O(n)。
3. 結論
其實這種找連續的數字,核心關鍵就是指標的移動,如果想要確保時間複雜度為O(n)表示每個數字只會被遍歷一次,肯定要使用 Hash 的方式來找。
我發現這題本來在幾年前是Hard現在變成Medium了,可是我很開心我竟然靠自己想到這種方法。這樣的感覺真的很棒,希望以後能夠更多的靠自己的力量解題。
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Shannon's Blog 🐟 技術 | 生活 | 旅行! 如果你覺得我的文章有幫助,希望你可以到我的 github 給我一個 star ⭐️ Shannon Blog Repo
評論