41. 缺失的第一个正数
给你一个未排序的整数数组
nums
,请你找出其中没有出现的最小的正整数。请你实现时间复杂度为
O(n)
并且只使用常数级别额外空间的解决方案。示例 1:
输入:nums = [1,2,0] 输出:3
示例 2:
输入:nums = [3,4,-1,1] 输出:2
示例 3:
输入:nums = [7,8,9,11,12] 输出:1
提示:
1 <= nums.length <= 5 * 10
5
2
31
<= nums[i] <= 2
31
- 1
通过次数216,573提交次数509,480
法1 数组原地hash
思路
将数组的值 - 1 作为该值的hash结果,且将该hash 结果作为该值的下标。
题解
class Solution: def firstMissingPositive(self, nums: List[int]) -> int: for i in range(0, len(nums)): # 该值的正确位置 idx = nums[i] - 1 while len(nums) >= nums[i] >= 1 and nums[idx] != idx + 1: nums[idx], nums[i] = nums[i], nums[idx] idx = nums[i] - 1 # 最后再检查一遍 for i in range(0, len(nums)): if nums[i] != i + 1: return i+1 return len(nums)+1