【LeetCode】41.缺失的第一个正数

283.移动零

知识点:数组;哈希表

题目描述

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

请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。

示例
输入:nums = [1,2,0]
输出:3

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

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

解法一:

其实仔细想一下这道题,缺失的第一个正数,假设数组的长度为n,那答案是多少呢?答案其实只能在[1,n+1]之间,这些数都有,那答案就是n+1,数组里一旦缺失一个,那就在这之间了
所以可以新建一个哈希表,然后将数组中的数存到哈希表中,然后从1到n+1开始遍历,依次查看是否在哈希表里,第一个找到的不在的,那就是答案了;
为什么要用哈希表呢,因为哈希表查找的快啊,这样时间和空间复杂度都是n;
那怎么不创建新的空间呢,哈希表是什么,不就是一个key-value键值对吗?数组不也是这样的吗?其实哈希表就是一个数组对吧;
那我们就可以直接在原始数组上去进行操作了,比如一个数为x,那就可以把这个数放到索引为x-1的位置上去,这样我们不就自己构造了一个哈希表吗?前提是这个数x在索引的范围内,那这样一遍完后,在【1,n】范围内的元素就放在了“该在的位置上去”,也就是nums[i] = i+1,那再看一遍,从0到n-1的位置上那些有的值已经到了自己的位置,一旦不一样,那这个位置+1就是我们要找的元素了;

class Solution:
    def firstMissingPositive(self, nums: List[int]) -> int:
        size = len(nums)
        for i in range(size):
            while nums[i] >=1 and nums[i] <= size and nums[i] != nums[nums[i]-1]:    # nums[i]在下标的范围内,并且两个不相等
                index = nums[i]-1
                nums[index], nums[i] = nums[i], nums[index]
        for i in range(size):
            if nums[i] != i+1:
                return i+1
        return size+1
posted @ 2022-03-29 09:35  Curryxin  阅读(38)  评论(0编辑  收藏  举报
Live2D