题目描述
给你一个未排序的整数数组,请你找出其中没有出现的最小的正整数。要求:算法复杂度:O(n) 空间复杂度:O(n)
题解
假设数组长为N,则未出现的最小正整数必然在【1,N+1】之间.
(1) 如果不允许在原数组上进行操作,则可以使用额外1-N+1的空间,遍历一遍数组标记出现过的数字。
(2) 如果允许在原数组上进行操作,则使用置换的方法:
对于每个出现在1-N之间的数字,还原到本来的位置,最多N次操作回到对应的位置,如果在交换的时候数字相同,则会出现死循环,需要及时跳出。
代码:
class Solution:
def firstMissingPositive(self, nums: List[int]) -> int:
length = len(nums)
for index in range(length):
if ( nums[index] == index + 1): #下标从0开始
continue
else:
while (nums[index] >= 1 and nums[index]<= length):
temp = nums[nums[index]-1]
if (temp == nums[index]):
break
nums[nums[index]- 1] = nums[index]
nums[index] = temp
min = length + 1
for index in range(length):
if (nums[index]== index+1):
continue
else:
min = index+ 1
break
return min