欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-04-27 16:42:02
1、题目描述类似题:3.数组中重复的数字(Array)https://blog.csdn.net/IOT_victor/article/details/104725037https://leetcode-cn.com/problems/first-missing-positive/给你一个未排序的整数数组,请你找出其中没有出现的最小的正整数。算法的时间复杂度应为O(n),只能使用常数级别的额外空间。输入: [1,2,0]输出: 3输入: [3,4,-1,1]输出: 2输入:...

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

相关标签: Array 哈希表