LeetCode41. 缺失的第一个正数

94 篇文章 6 订阅
29 篇文章 0 订阅

题目大意:找到一个未排序序列中的第一个缺失的正数。简而言之,就是看1在不在这个序列中,如果不在的话输出1;否则看2在不在这个序列中,如果不在的话输出2;否则看3在不在这个序列中……

题目分析:本题的难点在于只能使用常数级别的空间,也就是说,不能开辟一个flag数组,若出现某个数,就将flag值标1,最后看flag数组第一个为0的下标。本题的思路是从前往后将数放到它正确的位置上去。

举个例子,假设有序列[4,2,6,1,-3],首先看第一个数4,它正确的位置应该是在序列的第4个位置(位置数从1开始,正确的位置是第一个位置放1,第二个位置放2,第三个位置放3……最后我们只要看哪个位置放的不是理想的数,那么它就是第一个缺失的正数)。我们将4与第4个位置上的“1”进行交换,序列变成[1,2,6,4,-3];接着我们还是看第一个数,现在变成了“1”,它的确在它正确的位置,好了,我们再看第二个数2,也在正确的位置。第三个数6,本来应该放在第6个位置,可是该序列总共就5个位置,所以不移动;第四个数4在它的正确位置,不动;第五个数是负数,不动。最后,从前往后看,发现在第三个位置本该出现的3没有出现,所有该序列缺失的第一个正数是3。

所以归纳来说,将每个数放在它正确的位置,前提是该数是正数,并且该数小于序列长度,并且它正确位置上的那个数不是它,也就是说,把4要放在第4个位置,要保证第4个位置上的数不是4,如果是4的话,交换前后没什么变换,把两个4移来移去,还会造成死循环。

代码展示:

class Solution(object):
    def firstMissingPositive(self, nums):
        for i in range(0,len(nums)):
             while nums[i]>0 and nums[i]<=len(nums) and nums[nums[i]-1]!=nums[i]:
                nums[nums[i]-1],nums[i] = nums[i],nums[nums[i]-1]
        for i in range(0,len(nums)):
            if nums[i]!=(i+1):
                return i+1
        return len(nums)+1

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值