缺失的第一个正数(原地哈希算法)

2022-08-01,,,,

1、题目描述

类似题:3.数组中重复的数字(Array)https://blog.csdn.net/IOT_victor/article/details/104725037

https://leetcode-cn.com/problems/first-missing-positive/

给你一个未排序的整数数组,请你找出其中没有出现的最小的正整数。

算法的时间复杂度应为O(n),只能使用常数级别的额外空间。

输入: [1,2,0]
输出: 3

输入: [3,4,-1,1]
输出: 2

输入: [7,8,9,11,12]
输出: 1

2、代码详解

方法一:哈希表O(N),O(N)(空间复杂度不符合要求)

方法二:二分查找O(NlogN),O(1)(时间复杂度不符合要求)

查找一个元素,如果是在有序数组中查找,会快一些; 因此我们可以将数组先排序,再使用二分查找法从最小的正整数 1 开始查找,找不到就返回这个正整数。

方法三:原地哈希

要找的数一定在 [1, N + 1] 左闭右闭(这里 N 是数组的长度)这个区间里。因此,我们可以就把原始的数组当做哈希表来使用。

https://leetcode-cn.com/problems/first-missing-positive/solution/tong-pai-xu-python-dai-ma-by-liweiwei1419/

class Solution:
    # 3 应该放在索引为 2 的地方
    # 4 应该放在索引为 3 的地方
    def firstMissingPositive(self, nums):
        size = len(nums)
        for i in range(size):
            # 先判断这个数字是不是索引,然后判断这个数字是不是放在了正确的地方
            while 1 <= nums[i] <= size and nums[i] != nums[nums[i] - 1]:
                self.__swap(nums, i, nums[i] - 1)

        for i in range(size):
            if i + 1 != nums[i]:
                return i + 1

        return size + 1

    def __swap(self, nums, index1, index2):
        nums[index1], nums[index2] = nums[index2], nums[index1]

 

本文地址:https://blog.csdn.net/IOT_victor/article/details/107497712

《缺失的第一个正数(原地哈希算法).doc》

下载本文的Word格式文档,以方便收藏与打印。