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 * 105
  • 231 <= nums[i] <= 231 - 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