问题:
给定一个未排序的整数数组,找出其中没有出现的最小的正整数。
示例 1:
输入: [1,2,0],输出: 3
示例 2:
输入: [3,4,-1,1],输出: 2
示例 3:
输入: [7,8,9,11,12],输出: 1
说明:
你的算法的时间复杂度应为O(n),并且只能使用常数级别的空间。
思路及代码:
# 第一步:去重、排序;
# 第二步:判断是否为空、仅有一个元素且元素不为一;
# 第三步:考虑多种情况:1. 不存在非正数(看首个元素是否为一,若满足此条件则看index是否是nums[index]-1);
# 2. 仅存在一个非正数(看正数的部分index是否为nums[index]);
# 3. 存在多个非正数(看正数部分的index是否是nums[index]+(index-1))。
# (可整合:将正数部分放到nums[1:end],看是否index=nums[index]即可)
# 第四步:若上述条件均满足,那么返回数组最后一个元素值加一。
class Solution:
def firstMissingPositive(self, nums: List[int]) -> int:
nums_sorted = list(sorted(set(nums)))
if (nums_sorted == []) or (len(nums_sorted) == 1 and nums_sorted[0] != 1):
return 1
index = None
for i in range(len(nums_sorted)): # 找到首个正值索引
if nums_sorted[i] > 0:
index = i
break
if index or (index == 0 and nums_sorted[index] == 1): # 若index=0,但对应元素为1也要考虑进来
nums_new = [0]
nums_new = nums_new + nums_sorted[index : len(nums_sorted)] #将正数部分放到1 : end
for i in range(len(nums_new)):
if nums_new[i] != i:
return i
return nums_new[len(nums_new)-1]+1
else:
return 1
########## 此方法超时 ############
# # 第一步:排序;
# # 第二步:检查首个正元素是否是1,若不是1,直接返回1;反之,进行第三步;
# # 第三步:以1为步长,检查相邻两元素是否相差1,若不满足,返回当前不满足条件的元素值加一;
# # 第四步:若上述条件均满足,那么返回数组最后一个元素加一。
# class Solution:
# def firstMissingPositive(self, nums: List[int]) -> int:
# nums_sorted = sorted(nums) # sorted函数不会改变原数组,因此要定义一个新的
# if nums_sorted == []:
# return 1
# else:
# for i in range(len(nums_sorted)-1): # 找首个正元素索引
# if nums[i] > 0:
# tmp = i
# break
# if nums[tmp] != 1:
# return 1
# else:
# while (i < len(nums)-1) and (i >= tmp):
# if nums_sorted[i+1]-nums_sorted[i] == 1:
# continue
# else:
# return nums_sorted[i]+1 # 在第i处不满足条件,因此是索引i加一,不是i+1
# return nums_sorted[len(nums)-1]+1
知识点:
1. Python中没有NULL,用的是None。