leetcode专题训练 41. First Missing Positive

1.没有按照题中的时间复杂度要求写的一个能通过的代码。

class Solution:
    def firstMissingPositive(self, nums: List[int]) -> int:
        nums.sort()
        result = 1
        for num in nums:
            if num < result:
                continue
            if num == result:
                result += 1
            else:
                break
        return result

2.然后我看了题解。用数组本身做hash表是个很酷的事情。如果nums中全是正数,且某个数字num在nums中出现过的话,就把nums[num-1]这个位置的数值转化为负数,标记一下这个数字在数组中出现过。之后要做的就是把最小的大于0的数的位置+1就是最终答案了。不过这道题有几个注意事项:

  1. nums中会存在负数和大于len(nums)的数,大于长度的数在nums[num-1]操作中会越界。但是需要注意到的是,这两种情况的数对答案不会有影响,因为答案一定小于等于len(nums)+1,所以把这两种数全换为1就好了。
  2. 不能直接换为1,要在换之前判断整个nums中是否有1,如果没有1就直接返回1。昨晚这步判断之后,随便换就好了。
class Solution:
    def firstMissingPositive(self, nums: List[int]) -> int:
        if 1 not in nums:
            return 1
        for i in range(len(nums)):
            if nums[i] <= 0 or nums[i] > len(nums):
                nums[i] = 1
        for num in nums:
            tmp = num
            if num < 0:
                tmp = -tmp
            if nums[tmp-1] > 0:
                nums[tmp-1] = -nums[tmp-1]
        for i in range(len(nums)):
            if nums[i] > 0:
                return i+1
        return len(nums)+1

这段时间失踪了是因为我去学托福了。7月20日开始上课,然后上了一个月,9月7日考试。英语太难了,还是敲代码适合我。学英语的时候心态真的一天一崩,听力和阅读怎么那么难?学了那么久,觉得自己的英语水平还是很垃圾。希望首考能上90吧(I have a dream)。加油啊。考完了之后就是有证的人了。敲代码真的能让我感觉到身心愉悦,感觉得到了救赎。不过明天还要继续学托福啊,不能放弃,因为,贵。By the way, Queer Eye 真的好看。

发布了201 篇原创文章 · 获赞 26 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/Ema1997/article/details/100167823