Leetcode 41. 缺失的第一个正数 / 利用数组本身充当哈希表

题目

在这里插入图片描述
在这里插入图片描述

解题思路

题目相当于:找出[1, 数组长度+1]中最小的且没有在数组中出现过的元素。

利用数组本身充当哈希表:将1放在下标为0处,2放在下标为1处…这样保证如果数值在[1, 数组长度+1]范围内的,都在其对应的位置上,一旦某下标i处对应元素不是i+1,就说明数组中缺失了i+1这个元素。


代码实现

基本注释版本

class Solution:
    def firstMissingPositive(self, nums: List[int]) -> int:
        # 将每个元素交换到该去的位置上
        for i in range(len(nums)):
            # 属于[1, len(num)+1]区间中,同时对应位置上不是所需数值的才进行交换
            while 1 <= nums[i] <= len(nums) and nums[nums[i]-1] != nums[i]:
                nums[nums[i]-1], nums[i] = nums[i], nums[nums[i]-1]
        # 找出不在自己位置上的第一个正数
        for i in range(len(nums)):
            if nums[i] != i+1:
                return i+1
        return len(nums) + 1

详细注释版本,代码都一样,这个版本的注释记录了我遇到的所有问题

class Solution:
    def firstMissingPositive(self, nums) -> int:
        # 这样保证如果有1-len(nums)之间的数字,那么他们都在自己的位置上,不在自己位置上的数,就是我们要找的
        for i in range(len(nums)):
            # 这里不能写i != num[i]-1,eg[1, 1],因为如果对应位置上已经是正确的了,那么也不需要交换,否则可能出现死循环
            # i != nums[i] - 1 and nums[nums[i] - 1] != nums[i]简化为一句:应该放我的位置,没放我,就进行交换
            # 为什么是while循环:交换后,现在的新nums[i]元素也应该回到应去的地方
            while 1 <= nums[i] <= len(nums) and nums[nums[i]-1] != nums[i]:
                # 这样交换为什么不行?:Python将结果(等式右边)从左到右存储在多个目标中,再按顺序执行赋值目标表达式
                # 那么在这种情况下,nums[i]先被赋值,影响了nums[i]-1的计算,进而nums[i]-1并不是我们原本期望的位置
                # nums[i], nums[nums[i]-1] = nums[nums[i]-1], nums[i]
                self.swap(nums, i, nums[i]-1)
        for i in range(len(nums)):
            if nums[i] != i+1:
                return i + 1
        return len(nums) + 1

    def swap(self, num, ind1, ind2):
        num[ind1], num[ind2] = num[ind2], num[ind1]

おすすめ

転載: blog.csdn.net/qq_42711381/article/details/106986335