问题描述
给定一个未排序的整数数组,找出其中没有出现的最小的正整数。
说明
你的算法的时间复杂度应为O(n),并且只能使用常数级别的空间。
解答
首先因为只能使用常数级别的空间,就不能再建新的O(n)级的list,set等。然后就想到将列表去重去除非正数排序,最后循环当nums[i]和(i+1)不等是输出。
class Solution:
def firstMissingPositive(self, nums):
“””
:type nums: List[int]
:rtype: int
“””
nums = list(set([i for i in nums if i > 0]))
nums.sort()
for i in range(len(nums)):
if nums[i] != i + 1:
return i + 1
return len(nums) + 1
但是这样写并不正确。原因就在于使用的Python内置的函数的复杂度超过的O(n), 比如sort()的复杂度就是O(nlogn)。详细资料可以参考Python内置函数时间复杂度
经过思考,只需要将列表中在列表长度范围内的正整数n移动到列表(n-1)的位置,然后再循环当nums[i]和(i+1)不等是输出。
class Solution:
def firstMissingPositive(self, nums):
“””
:type nums: List[int]
:rtype: int
“””
k = len(nums)
if k == 0:
return 1
for i in range(k):
while 0 < nums[i] <= k and nums[i] != nums[nums[i] – 1]:
a = nums[nums[i] – 1]
nums[nums[i] – 1] = nums[i]
nums[i] = a
for i in range(k):
if nums[i] != i + 1:
return i+1
return k + 1
转载请注明:XAMPP中文组官网 » 缺失的第一个正数