leetcode_41. 缺失的第一个正数

本文详细解析了LeetCode第41题“缺失的第一个正数”,通过桶排序算法找到无序数组中缺失的最小正整数。文章提供了Python代码实现,并对比了不同方法的优劣。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

leetcode_41. 缺失的第一个正数

题目

leetcode题目链接

思路分析

题目要求:无序数组中缺失的最小正整数

桶排序
参考博客

代码展示

from typing import List
class Solution:

#桶排序的错的理解
    def firstMissingPositive1(self, nums: List[int]) -> int:
        count = 0
        while count<len(nums):
            i = count
            #虽然表面上对所有的元素进行了排序,把当前的元素放在正确的位置上
            #但是,中途发生了交换,会导致被交换到前面的元素没有判断。
            #问题就是出在 if,应该用 循环。
            if nums[i]>0 and nums[i]<=len(nums):
                nums[i],nums[nums[i]-1]=nums[nums[i]-1],nums[i]
            count+=1
        for i in range(len(nums)):
            if nums[i]!=i+1:
                return i+1
        return len(nums)+1


#桶排序
    def firstMissingPositive2(self, nums: List[int]) -> int:
        for i in range(0,len(nums)):
            # 对每一个位置 不断判断交换
            #只要当前元素满足 在特定的数值范围内并且当前的元素不应该在这个位置上。
            #所以 一次循环下来 当前位置上的元素 要么就是应该在这个位置上,要么不满足范围要求
            while nums[i]>0 and nums[i]<=len(nums) and nums[nums[i]-1]!=nums[i]:
                print(i,nums[i],nums[nums[i]-1],nums)
                nums[nums[i]-1],nums[i] = nums[i],nums[nums[i]-1]
                print('i:',i,nums)
        for i in range(0,len(nums)):
            if nums[i]!=(i+1):
                return i+1
        return len(nums)+1


    def firstMissingPositive4(self, nums):
        for i in range(1,len(nums)+2):
            if i not in nums:
                return i
            

if __name__ == "__main__":
    
    a = Solution()
    print(a.firstMissingPositive2([3,4,-1,1]))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值