[2025-10-02] Leetcode 41. 缺失的第一个正数(这次官方又不用标准库了)

题目

41. 缺失的第一个正数
给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。
请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。
 
示例 1:
输入:nums = [1,2,0]
输出:3
解释:范围 [1,2] 中的数字都在数组中。
示例 2:
输入:nums = [3,4,-1,1]
输出:2
解释:1 在数组中,但 2 没有。
示例 3:
输入:nums = [7,8,9,11,12]
输出:1
解释:最小的正数 1 没有出现。
 
提示:

  • 1 <= nums.length <= 105
  • -231 <= nums[i] <= 231 – 1

我的代码(Python)

version 1

class Solution:
    def firstMissingPositive(self, nums: List[int]) -> int:
        numsSet = set(nums)
        i = 1
        while i in numsSet:
            i += 1
        return i

最直观的解法,使用标准库里的set实现。不过这样总觉得是在取巧……另外空间复杂度也没有达到O(1)。

version 2

class Solution:
    def firstMissingPositive(self, nums: List[int]) -> int:
        nums.sort()
        result = 1
        for num in nums:
            if num <= 0:
                continue
            if num > result:
                break
            result = num + 1
        return result

另外一种直观解法,排序。本来以为这样效率会低,结果居然能击败90%?list的排序根据网上的信息,最低是可以达到O(n),但是一般应该是O(nlogn)级别的,这样也可以满足要求吗?

点评

基本上能想到的,除了哈希就是排序了(哈希其实也算一种排序方式)。
官方果然也是用哈希表,不过这次又不用标准库了,大概是时间复杂度不够。
制作[1, N]作为哈希表,这个想法很巧妙。
我一直想的是需要创建从1到max(nums)的哈希表,这样也太大了;还是思路没有打开。
后面一种置换法在前一种的基础上就比较好想了。


baddif@gmail.com

AI简历优化站

Nonpareil.me:优化简历,助力职场
开源代码

AI求职跟踪器(建设中)

开源代码

主站(建设中)

Nonpareil Me

相关平台

Github Issues / Notion / Blog

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部