【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