难度困难506收藏分享切换为英文关注反馈
给你一个未排序的整数数组,请你找出其中没有出现的最小的正整数。
提示:
你的算法的时间复杂度应为O(n),并且只能使用常数级别的额外空间。
示例 1:
输入: [1,2,0] 输出: 3
示例 2:
输入: [3,4,-1,1] 输出: 2
示例 3:
输入: [7,8,9,11,12] 输出: 1
思路:看到第一眼,脑子想到的是位图,创建长度为n的数组,将nums里大于0小于size的数字插入到对应位置,然后遍历位图数组,找到第一个为0的数的位置,若找不到返回数组长度+1,但是看到有空间要求,这么做空间复杂度为o(n),不符合。
数以更换了思路,依旧是遍历整个数组,将nums里大于0小于size的数字交换到对应位置,若发生交换,在原位置上再进行一次判断是否需要重新交换。附上代码
class Solution(object):
def firstMissingPositive(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
# result=[0 for i in range(len(nums))]
i=0
while(i<len(nums)):
if nums[i]>0 and nums[i]<len(nums) and nums[i] != nums[nums[i]-1]:
temp=nums[nums[i]-1]
nums[nums[i]-1]=nums[i]
nums[i] =temp
i=i-1
i=i+1
for i in range(len(nums)):
if i+1!=nums[i]:
return i+1
return len(nums)+1
a=[-1,4,2,1,9,10]
print(Solution.firstMissingPositive(1,a))