leetcode : First Missing Positive
runtime 48 ms, beats 93.89% of cpp submissions
O(n) solution with explanation
tags: none
🔗 link
📖 description
給定一個陣列 nums ,求出第一個不在 nums 裡的正數 (從 1 開始)
要求時間複雜度 O(n) ,空間複雜度 O(1)
ex. Input: nums = [1,2,0] Output: 3 Explanation: The numbers in the range [1,2] are all in the array.
🧠 solution
本題是一個連暴力解都比較難想的題目,但只要掌握一個關鍵,題目就變得很簡單了。
要求出第一個不在陣列中的正數,假設這個數字是 k ,那我們要做的事就是維護前 k-1 個正數,看他們是否都是存在的,所以只需要使用一個最多 n 長的陣列 ( n 為 nums 長度) ,將 nums 的元素 map 進陣列中,再掃過一次就知道答案了,但因為題目要求不能使用額外空 間,所以我們可以使用 nums 來替代儲存空間。
主要得做法如下
ex. Input: nums = [3,4,-1,1] Output: 2 將數字 map 到陣列中後,我們可以建構出這樣的結果 1 2 3 4 [1, -1, 3, 4] 我們可以發現只有 index 為 2 的部分是我們找不到的,所以答案就是 2
⏳ time complexity
掃過陣列並 map 回去,時間複雜度為 O(n)
再掃過一次陣列確認答案,時間複雜度為 O(n)
總時間複雜度 O(n)
📝 code
1 | class Solution { |