leetcode 每日一题 41. 缺失的第一个正数

leetcode 每日一题   41. 缺失的第一个正数

哈希表

思路:

把数组本身作为哈希表,数组内每个元素的值作为索引,将对应位置的值转换为负数,通过判断正负来判断对应值是否出现过。

①如果数组中不存在1,返回1。如果存在1,数组大小为1,返回2。

②把数组中的负数和0还有大于数组数量的值变为1

③遍历数组,把当前位置值的值作为下标,找到下标对应的值取负。如果值等于数组数量,则把第0位值取负。(这里0的位置是用来判断特殊情况,比如下标1-(n-1)值都找到,但是n值没找到,返回n;如果n值也找到,那么返回n+1)

④从下标1开始遍历数组,找到下标对应值为正的,返回下标值

例如:

[-1,-2,1,2,0]

=>[1,1,1,2,0]

=>[1,-1,-1,1,2,0]

=>3

[4,3,2,1]

=>[4,3,2,1]

=>[-4,-3,-2,-1]

=>5

[3,0,1,2]

=>[3,1,1,2]

=>[3,-1,-1,-2]

=>4

class Solution:
    def firstMissingPositive(self, nums):
        n = len(nums)
        if 1 not in nums:
            return 1
        if n == 1:
            return 2
        for i in range(n):
            if nums[i] <= 0 or nums[i] > n:
                nums[i] = 1
        for i in range(n): 
            a = abs(nums[i])
            if a == n:
                nums[0] = - abs(nums[0])
            else:
                nums[a] = - abs(nums[a])
        for i in range(1, n):
            if nums[i] > 0:
                return i
        if nums[0] > 0:
            return n 
        return n + 1

 

上一篇:【剑指offer】【】41. 数据流中的中位数


下一篇:【渝粤教育】广东开放大学 国际私法 形成性考核 (41)