Question
Given an unsorted integer array, find the first missing positive integer.
For example,
Given [1,2,0] return 3,
and [3,4,-1,1] return 2.
Your algorithm should run in O(n) time and uses constant space.
本题难度Hard。有2种算法分别是: DP和HashMap(推荐)
1、DP
【复杂度】
时间 O(N) 空间 O(N)
【思路】
我们只要将最小的一段连续值(记住是连续的值)的范围(min,max)
求出,然后:
主要问题在于数字是乱序的,所以就使用DP。对于nums[i]
无非就是几种情况:
1、min>nums[i]
如果min-1==nums[i]
,那么min
移到nums[i]
否则,就是出现了新的最小的(min,max)
(与当前的(min,max)
断开了),那么就保存当前的(min,max)
,再跳到新的(min,max)
2、max<nums[i]
如果max+1==nums[i]
,这里不是立即就将max
移到nums[i]
,因为有可能这里的nums[i]
之前已经判断过了,所以要到map中查看之前有没有保存过;然后还要判断max+1以及以后的有没有保存过(行32-34)
否则,这里我们就不必再移动(min,max)
,如果nums[i]
没有保存过,就进行保存
【注意】
1、在对min和max进行初始化时候,是从nums中找到正数(行14-20)
2、同理,在处理过程中,我们只对正数进行处理(行22)
【代码】
2、HashMap
【复杂度】
时间 O(N) 空间 O(N)
【思路】
将所有正数都先放到map里面,然后就从小正数——也就是1——开始检查map,遇到的第一个不包含在map中的正数便是答案。(简直就是暴力的美学)
【代码】
参考
First Missing Positive@LeetCode