每日一题算法:2020年6月27日 缺失的第一个正数 firstMissingPositive

本文探讨了LeetCode中的2020年6月27日每日一题——缺失的第一个正数firstMissingPositive。文章分析了不同解题策略的时间复杂度,包括排序法和哈希表法,并指出在限制额外空间使用的情况下,如何利用原数组找到最小缺失正数。通过遍历数组,将元素放到正确位置,最终找到第一个0的位置作为结果。
摘要由CSDN通过智能技术生成

2020年6月27日 缺失的第一个正数 firstMissingPositive

在这里插入图片描述
默认格式:

class Solution {
   
    public int firstMissingPositive(int[] nums) {
   

    }
}

解题思路:

如果不考虑限制条件,能够直接先排序然后寻找从1开始第一个没有出现的值,那个值就是最小没有出现的正整数。这样的时间复杂度是O(nlogn)。

如果要控制时间复杂度,可以把每个大于0的值都存到哈希表中,然后遍历这个哈希表,寻找第一个没有出现的值,这样的时间复杂度是O(n)但是空间复杂度就是O(n)了,也不符合题目中的要求。

那么如果不允许这么做,我们能做的只有找到缺失位置和没有排序数字之间的关系。

应该有那么几个关键位置能够记录。

在想这道题的时候,我产生了一个疑惑,他给我传入了一个数组,我不新建数组,就在原数组的地址上该值,属不属于额外空间。然后我去查阅了资料,资料上说不属于额外空间,那么意味着我之前的方向是错误的,所谓的不使用额外的空间,我们可以利用传入的数组来存我们的值。

最小的缺失正数和数组有如下的关系。

最小缺失正数必定小于数组长度-1。因为只有在数组的所有值都是从1开始连续的正整数,才会出现最小缺失的正整数是长度+1的情况。

那么我们遍历一遍数组,将每个数插入到他应该存在的位置,比如把2插入到下标1的位置,5插入到下标4的位置。

如果数字超过长度或者小于等于0,则不处理直接记为0。

处理结束后,遍历一遍数组,找到第一个值为0的位置。

图示:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值