41. First Missing Positive
題目網址:https://leetcode.cn/problems/first-missing-positive/
題意:給一未排序的整數 array
nums
, 返回其中未出現的最小正整數。必須設計 $O(n)$ time 且 $O(1)$ space 的演算法。
Solution 1:
想法:利用 hash table, 首先 hash table 儲存出現過的數, 然後再從
1
開始遍歷到n
。若其中有不在 hash table 中的, 則直接返回該數。否則, 返回n + 1
class Solution { |
- time:$O(n)$ ➔ for loop
- space:$O(n)$ ➔
umap
, 並不符合題目要求
Solution 2:
想法:改進 Solution 1, 把
nums
本身當作 hash table 使用, 利用nums[i]
判斷i + 1
是否存在。若i + 1
存在, 則nums[i] == i + 1
- 若
nums[i]
超出邊界, 或nums[i]
已經放在正確的位置上, 則往下一個數- 否則, 用 swap 將
nums[i]
放在正確的位置上。可是 swap 完後, 不保證idx = i
的位置擺的是正確的值, 因此要用 while loop 來確認, 直到nums[i] == i + 1
, 才能往下一個數
class Solution { |
- time:$O(n)$ ➔ for loop, 因為 while loop 中每個 idx 的位置最多做常數次
- space:$O(1)$ ➔ 只需常數空間
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Zako's Blog!
評論