本题解采用原地哈希的思想。目标是将所有在1到n范围内的数放到它们应该在的位置上(即值为i的数放在下标为i-1的位置上)。这样,第一个不满足nums[i] == i + 1的下标i就是缺失的最小正数。首先遍历数组,对于每个元素nums[i],如果它在1到n的范围内且不在正确的位置上,就将它与nums[nums[i] - 1]交换,直到无法交换为止。然后再次遍历数组,找到第一个不满足nums[i] == i + 1的下标i,返回i + 1作为缺失的最小正数。如果所有数都在正确的位置上,则返回n + 1。
时间复杂度: O(n)
空间复杂度: O(1)
class Solution:
def firstMissingPositive(self, nums: List[int]) -> int:
for i in range(len(nums)):
# 将nums[i]放到正确的位置上,直到无法交换或nums[i]不在1到n的范围内
while 0 < nums[i] <= len(nums) and nums[i] != nums[nums[i]-1]:
nums[nums[i]-1], nums[i] = nums[i], nums[nums[i]-1]
# 找到第一个不在正确位置的元素
for i in range(len(nums)):
if nums[i] != i+1:
return i + 1
# 如果所有元素都在正确的位置,则返回n + 1
return len(nums) + 1