Skip to the content.

leetcode [41] 缺失的第一个正数


Contact me:

Blog -> https://cugtyt.github.io/blog/index
Email -> cugtyt@qq.com
GitHub -> Cugtyt@GitHub


给定一个未排序的整数数组,找出其中没有出现的最小的正整数。

示例 1:

输入: [1,2,0]
输出: 3

示例 2:

输入: [3,4,-1,1]
输出: 2

示例 3:

输入: [7,8,9,11,12]
输出: 1

说明:

你的算法的时间复杂度应为O(n),并且只能使用常数级别的空间。

先做预处理,去掉小于等于0的。最小值如果不是1,可以直接返回1。然后减去最小值(1),让数以0开始,这样可以对应到下标。遍历,如果下标不等于值,那么和值为下标的数交换。为了避免遇到交换死循环,如果碰到值大于数组容纳范围或者交换相等的情况,退出交换。

class Solution:
    def firstMissingPositive(self, nums: List[int]) -> int:
        nums = [n for n in nums if n > 0]
        if len(nums) == 0:
            return 1
        minvalue = min(nums)
        if minvalue != 1:
            return 1
        nums = [n - minvalue for n in nums]
        i = 0
        for i, n in enumerate(nums):
            while nums[i] != i:
                if nums[i] >= len(nums) or nums[i] == nums[nums[i]]:
                    break
                j = nums[i]
                nums[i], nums[j] = nums[j], nums[i]
        for i, n in enumerate(nums):
            if i != n:
                return i + minvalue
        return len(nums) + minvalue