解题思路-leetcode第四十一题:缺失的第一个正数

解题思路-leetcode第四十一题:缺失的第一个正数

题目描述:给你一个未排序的整数数组,请你找出其中没有出现的最小的正整数。
示例 1:
输入: [1,2,0]
输出: 3
示例 2:
输入: [3,4,-1,1]
输出: 2
示例 3:
输入: [7,8,9,11,12]
输出: 1
提示:
你的算法的时间复杂度应为O(n),并且只能使用常数级别的额外空间。
解题思路:因为本题对时间复杂度和空间复杂度做出了要求,所以无法使用双循环暴力解法,故本题采用多次遍历列表,并通过对列表元素进行标记的方法解题,首先第一次遍历列表,将列表内小于等于0的数都复制为l+1,由此保证列表内元素都为正,然后第二次遍历数组,对每一个元素,求出该元素的绝对值减1的值(此处减1是因为数组元素从0开始,加绝对值是因为下一步的操作可能会改变遍历位置元素的正负),并赋值给t,若t小于列表长度,则将列表内t位置元素变成负数(此处要先将元素求绝对值再加负号,以此保证元素不重复加负号)。最后一次遍历列表,遇到第一个大于0的数时,返回此时的下标加1。否则返回列表长度加1。代码如下:

class Solution:
    def firstMissingPositive(self, nums: List[int]) -> int:
        l = len(nums)
        for i in range(l):
            if nums[i] <= 0:
                nums[i] = l + 1
        for i in range(l):
            t = abs(nums[i]) - 1
            if t < l:
                nums[t] = -abs(nums[t])
        for i in range(l):
            if nums[i] > 0:
                return i + 1
        return l + 1

提交后,通过。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值