https://leetcode.com/problems/first-missing-positive/description/
题意:给定一个未排序的整数数组,找出其中没有出现的最小的正整数。
思路:把所有正数i放到数组中第i-1个位置上,即nums[i-1] = i
然后从头遍历,找第一个缺位的,就是没出现的最小正数。
难点在于怎么放,从i=0开始遍历数组,对于正常情况以及非正数,还有数值大于数组长度的(没地方放),跳过,i向前。
对nums[i],他的位置应该是nums[i]-1,即nums[i] = nums[nums[i]-1]
(根据上面的坐标公式变换而来),因此若不符合这个条件,将这两个元素交换,i不动。
对其他情况,i向前移动。
class Solution:
def firstMissingPositive(self, nums):
"""
:type candidates: List[int]
:type target: int
:rtype: List[List[int]]
"""
i = 0
while i < len(nums):
if nums[i] == i+1 or nums[i] <= 0 or nums[i] > len(nums):
i += 1
elif nums[nums[i]-1] != nums[i]:
self.swap(nums, i, nums[i]-1) #调用函数交换
else:
i += 1
i = 0
while i < len(nums) and nums[i] == i+1:
i += 1
return i+1
def swap(self, nums, i, j): #交换函数
tmp = nums[i]
nums[i] = nums[j]
nums[j] = tmp