leetcode 41. 缺失的第一個正數 - python

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...

相關文章
相關標籤/搜索