Leetcode Link: 41. 缺失的第一个正数 - 力扣(LeetCode)

题目

解法一

思路:不考虑题目时空复杂度要求,磨磨唧唧 debug 出来了

题解

class Solution:
    def firstMissingPositive(self, nums: List[int]) -> int:
        # 先排序 + 特例
        nums.sort()
        if nums[-1] <= 0: 
            return 1 
        # 找到第一个大于0的位置,截断,去重,重新排序(因为list后又无序了)
        for i in range(len(nums)):
            if nums[i] > 0:
                nums = list(set(nums[i:]))
                nums.sort()
                break
        # 找第一缺少的正整数
        res = 1
        for val in nums:
            if val != res:
                break
            res += 1
        return res

解法二

思路:把大于 0 的都装到 set 里,然后从 1~len (nums) 一个一个找

注意一定要找len(nums), 因为有一种可能是nums里装了全部的1~len(nums),而不是 0 ~ len(nums)-1

题解

class Solution:
    def firstMissingPositive(self, nums: List[int]) -> int:
        ss = set()
        for val in nums:
            if val>0: ss.add(val)
        
        for now in range(1, len(nums)+1):
            if now not in ss:
                break
            now += 1
        return now

解法三

思路缺失的第一个正数 - 缺失的第一个正数 - 力扣(LeetCode)

没几把推看明白,不想看了,脑瓜子已经迷糊了,有空再说吧

置换的方法巧,看不懂再看哈希。

题解

启发和联系