又是一年考研季到了
随着年龄的增长
发现对时间的敏感度越来越高
还未驻足细细体会新的征程
就发现后来者已经要强行裹挟着你前进了
但无论如何
还是希望我的一些朋友加油!
放平心态
取得自己理想的成绩!!!
41-缺失的第一个正数
给定一个未排序的整数数组,找出其中没有出现的最小的正整数。
示例 1:
输入: [1,2,0]
输出: 3
示例 2:
输入: [3,4,-1,1]
输出: 2
示例 3:
输入: [7,8,9,11,12]
输出: 1
这一题虽然等级是困难,但其实并不难,没什么复杂的算法,主要就是考分类情况。只要你把每一种情况考虑到了,这一题就很好解出来了。
分类情况:
- 如果给定数组里的元素都小于0,则最小正整数为1
- 如果给定数组里的元素都大于0,这时候还得看这些元素是否连续了。如果元素依次连续,则最小正整数为1;反之,则最小正整数为:第一个不能连续的元素值+1。比如输入: [3,4,-1,1] 输出: 2
- 如果给定数组里的元素既有小于0的,也有大于0的,这时候主要还是看给定数组里大于0的那些元素,至于其分类情况,就直接参考分类情况2了。
代码如下:
class Solution:
# 本题算法的时间复杂度应为O(n),所以直接用个for循环即可
# 本题需要注意的是给定的未排序数组列表nums里面可能有重复数字,所以下面判断相邻两个数大小关系的的时候需要注意
def firstMissingPositive(self, nums):
"""
:type nums: List[int]-->给定的未排序数组列表
:rtype: int-->final_min_number
"""
# 定义最终找到的最小正整数
final_min_number = 1
# 对给定的nums列表进行预处理,得到nums列表中大于0的元素,且最终从小到大排列
new_nums = [index for index in nums if index > 0]
# 如果得到的新列表new_nums里面没有正整数,说明nums列表中最大正整数为1,直接返回1
if len(new_nums) == 0:
return final_min_number
new_nums.sort()
# 遍历新数组列表new_nums,找到里面最小正整数
for indice in range(len(new_nums)):
# 如果列表new_nums中第一个数大于1,则可说明该列表中最小正整数为1
if new_nums[0] > 1:
break
# 如果列表中当前值与前一个值的差值大于1,说明中间有值可以插入了,也就是我们需要的最小正整数
if indice > 0 and new_nums[indice] - new_nums[indice-1] > 1:
final_min_number = new_nums[indice-1]+1
break
final_min_number = new_nums[indice]+1
return final_min_number
if __name__ == "__main__":
nums = [0,2,2,1,1]
result = Solution().firstMissingPositive(nums)
print(result)
运行速度还不错,在90%以上。