又是一年考研季到了

随着年龄的增长

发现对时间的敏感度越来越高

还未驻足细细体会新的征程

就发现后来者已经要强行裹挟着你前进了

LeetCode41-缺失的第一个正数

但无论如何

还是希望我的一些朋友加油!

放平心态

取得自己理想的成绩!!!


41-缺失的第一个正数

给定一个未排序的整数数组,找出其中没有出现的最小的正整数。

示例 1:

输入: [1,2,0]
输出: 3

示例 2:

输入: [3,4,-1,1]
输出: 2

示例 3:

输入: [7,8,9,11,12]
输出: 1

这一题虽然等级是困难,但其实并不难,没什么复杂的算法,主要就是考分类情况。只要你把每一种情况考虑到了,这一题就很好解出来了。

分类情况:

  1. 如果给定数组里的元素都小于0,则最小正整数为1
  2. 如果给定数组里的元素都大于0,这时候还得看这些元素是否连续了。如果元素依次连续,则最小正整数为1;反之,则最小正整数为:第一个不能连续的元素值+1。比如输入: [3,4,-1,1] 输出: 2
  3. 如果给定数组里的元素既有小于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%以上。

LeetCode41-缺失的第一个正数

 

 

相关文章: