当前位置: 移动技术网 > IT编程>开发语言>.net > LeetCode41. 缺失的第一个正数(原地哈希)

LeetCode41. 缺失的第一个正数(原地哈希)

2020年07月22日  | 移动技术网IT编程  | 我要评论
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

如您对本文有疑问或者有任何想说的,请 点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网