缺失的第一个正数 给定一个未排序的整数数组 nums ,找出其中没有出现过的最小的正整数 要求:时间复杂度为O(n)
时间: 2024-05-04 15:17:49 浏览: 154
leetcode卡-FirstMissingPositives:第一个缺失的正数
可以使用桶排序的思想来解决这个问题。
首先,我们可以遍历一遍数组,把所有正整数放入一个桶中,桶的下标为该正整数减一(因为数组下标从0开始,而正整数从1开始)。比如,如果数组中有3这个正整数,我们就将桶中的第2个元素(下标为2)标记为已经存在。这样,桶中第一个没有被标记的元素就是最小的未出现过的正整数。
接下来,再遍历一遍桶,找出第一个没有被标记的元素的下标,并返回该下标加一即可。如果所有桶都被标记了,说明数组中的所有正整数都出现过,此时最小的未出现过的正整数为数组长度加一。
以下是代码实现:
```python
def firstMissingPositive(nums):
n = len(nums)
# 将所有负数和0都视为不存在的数,因为我们要找的是最小的正整数
for i in range(n):
if nums[i] <= 0:
nums[i] = n + 1
# 将所有存在的正整数对应的桶标记为已经存在
for i in range(n):
num = abs(nums[i])
if num <= n:
nums[num - 1] = -abs(nums[num - 1])
# 找到第一个没有被标记的桶的下标,即为最小的未出现过的正整数
for i in range(n):
if nums[i] > 0:
return i + 1
# 如果所有桶都被标记了,说明数组中的所有正整数都出现过,此时最小的未出现过的正整数为数组长度加一
return n + 1
```
时间复杂度为O(n),空间复杂度为O(1)。
阅读全文