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
相关文章
相关标签/搜索