https://leetcode-cn.com/probl...python
給定正數數組 nums,返回數組中沒有的最小的一個正整數。算法
要求:時間複雜度 O(n),空間複雜度 O(1)數組
這個題目的巧妙之處在於利用了輸入的數組作標記,這樣省去了使用額外空間,從而實現了 O(1) 的空間複雜度。code
關鍵點是:設數組長度爲 n,那麼答案必定在 [1, n+1] 之中。這是顯而易見,由於 nums 裏只有 n 個數,不可能出現 [1, n+1] 裏的全部數字。排序
若是想實現 O(n) 的時間複雜度,只能遍歷,不能排序,這裏的方法是leetcode
處理特殊狀況,若是 1 再也不 nums 裏,答案天然是 1。不然:get
首先除掉數組中 [1, n+1] 之外的數,由於他們根本不會影響結果,乾脆把這些數都寫成 1。博客
而後,nums 裏只有正數了,並且值在 [1, n] 以內。咱們遍歷數組,對於數組裏每一個數字,令 nums 對應的第這個位置的數變成負數。就把全部數的位置標記出來了,至關於用了一個桶排序算法。it
而後再遍歷一下,第一個不是負數的位置就是缺失的數了。io
這裏須要特殊處理 n,由於 n 會越界,乾脆用位置 0 表明 n,或者也能夠把全部數統一減一。
class Solution: def firstMissingPositive(self, nums: List[int]) -> int: if 1 not in nums: return 1 n = len(nums) for i in range(n): if nums[i] > n or nums[i] <= 0: nums[i] = 1 for i in range(n): a = abs(nums[i]) if a == n: nums[0] = -abs(nums[0]) else: nums[a] = -abs(nums[a]) for i in range(2, n): if nums[i] > 0: return i return n if nums[0] > 0 else n+1
歡迎來個人博客: https://codeplot.top/
個人博客刷題分類:https://codeplot.top/categori...