41. 缺失的第一個正數

問題

問題描述

給定一個未排序的整數數組,找出其中沒有出現的最小的正整數。python

說明

你的算法的時間複雜度應爲O(n),而且只能使用常數級別的空間。算法


解答

首先由於只能使用常數級別的空間,就不能再建新的O(n)級的list,set等。而後就想到將列表去重去除非正數排序,最後循環當nums[i]和(i+1)不等是輸出。數組

class Solution:
    def firstMissingPositive(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        nums = list(set([i for i in nums if i > 0]))
        nums.sort()
        for i in range(len(nums)):
            if nums[i] != i + 1:
                return i + 1
        return len(nums) + 1

可是這樣寫並不正確。緣由就在於使用的Python內置的函數的複雜度超過的O(n), 好比sort()的複雜度就是O(nlogn)。詳細資料能夠參考Python內置函數時間複雜度函數

通過思考,只須要將列表中在列表長度範圍內的正整數n移動到列表(n-1)的位置,而後再循環當nums[i]和(i+1)不等是輸出。code

class Solution:
    def firstMissingPositive(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        k = len(nums)
        if k == 0:
            return 1
        for i in range(k):
            while 0 < nums[i] <= k and nums[i] != nums[nums[i] - 1]:
                a = nums[nums[i] - 1]
                nums[nums[i] - 1] = nums[i]
                nums[i] = a
        for i in range(k):
            if nums[i] != i + 1:
                return i+1
        return k + 1
相關文章
相關標籤/搜索