哈哈哈,今天有一些晚,别说了,今天的我是一事无成的我,等科二考试等了一整天,但是最后还是没考,我哭了,好累啊。明天努力,明天上午项目相关,下午和晚上自学。
力扣题目描述:
给你一个未排序的整数数组,请你找出其中没有出现的最小的正整数。
示例 1:
输入: [1,2,0]
输出: 3
示例 2:
输入: [3,4,-1,1]
输出: 2
示例 3:
输入: [7,8,9,11,12]
输出: 1
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/first-missing-positive
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
这个题目是困难,说实话,有把我吓到,但是呢,实际上就是只要思维缜密一些就没问题。
需要考虑到的几个问题:
1.最小的正整数在正常下就是1,因此当1不在数组中的时候,直接返回1即可。
2.当1在数组中时,就要明确,我们需要寻找断点(从1开始,之后必须是2,3…),例如,1,2,4就存在断点。
3.没有断点的话,nums[i]==i-k+1(k指1的索引)
4.考虑重复元素问题—先去重
代码如下:
class Solution:
def firstMissingPositive(self, nums: List[int]) -> int:
def search(lists):
if(1 not in lists):
return 1
# 定义一个查找数组第一个断点的位置,lists是经过排序的不空的数组
k=0
for i in range(len(lists)):
if(nums[i]<1):
k+=1
# 1位于第k位置
if(nums[i]>1):
if(nums[i]!=i-k+1):
return i-k+1
return lists[-1]+1
if(not nums):
return 1
newNums=[]
for i in range(len(nums)):
if(nums[i] not in newNums):
newNums.append(nums[i])
nums=sorted(newNums)
return (search(nums))