缺失的第一个正数(原地哈希算法)
程序员文章站
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 是数组的长度)这个区间里。因此,我们可以就把原始的数组当做哈希表来使用。
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