力扣刷题Day 42:缺失的第一个正数(238)

1.题目描述

力扣刷题Day 42:缺失的第一个正数(238)_第1张图片

2.思路

方法1:把原数组转化成集合,然后从1开始递增查询当前正整数是否在集合里。

方法2:将原数组进行排序,删除非正数,再在数组头部加入元素0, 遍历数组就可以找出其中没有出现的最小正整数。

方法3:灵茶山艾府大佬的换座位思路,一个萝卜一个坑,非常巧妙。

3.代码(Python3)

方法1:

class Solution:
    def firstMissingPositive(self, nums: List[int]) -> int:
        nums = set(nums)
        min_miss = 1
        while 1:
            if min_miss not in nums:
                return min_miss
            min_miss += 1

方法2:

class Solution:
    def firstMissingPositive(self, nums: List[int]) -> int:
        nums.sort()
        while nums[0] <= 0:
            nums.pop(0)
            if not nums:
                return 1
        nums.insert(0, 0)
        for i in range(1, len(nums)):
            if nums[i] != nums[i - 1] + 1 and nums[i] != nums[i - 1]:
                return nums[i - 1] + 1
        return nums[-1] + 1

方法3:

class Solution:
    def firstMissingPositive(self, nums: List[int]) -> int:
        n = len(nums)
        # 换座位
        for i in range(n):
            while (1 <= nums[i] <= n) and nums[i] != nums[nums[i] - 1]:
                j = nums[i] - 1
                nums[i], nums[j] = nums[j], nums[i]
        # 是否匹配
        for i in range(n):
            if nums[i] != i + 1:
                return i + 1
        return n + 1

4.执行情况

方法1:

力扣刷题Day 42:缺失的第一个正数(238)_第2张图片

方法2:

力扣刷题Day 42:缺失的第一个正数(238)_第3张图片

方法三:

力扣刷题Day 42:缺失的第一个正数(238)_第4张图片

5.感想

不知道方法1算不算是使用了常数级别的额外空间,而且我天呢被方法3绕晕了我不是开玩笑,直接nums[i] - 1 != i不行,去了j = nums[i] - 1也不行T_T

你可能感兴趣的:(力扣刷题日记,力扣,leetcode,算法)