【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

__EOF__

本文作者Curryxin
本文链接https://www.cnblogs.com/Curryxin/p/16070232.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   Curryxin  阅读(38)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· [翻译] 为什么 Tracebit 用 C# 开发
· 腾讯ima接入deepseek-r1,借用别人脑子用用成真了~
· Deepseek官网太卡,教你白嫖阿里云的Deepseek-R1满血版
· DeepSeek崛起:程序员“饭碗”被抢,还是职业进化新起点?
· RFID实践——.NET IoT程序读取高频RFID卡/标签
Live2D
欢迎阅读『【LeetCode】41.缺失的第一个正数』
点击右上角即可分享
微信分享提示