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的位置。
图示: