题目
给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。
请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。
示例 1:
输入:nums = [1,2,0]
输出:3
示例 2:
输入:nums = [3,4,-1,1]
输出:2
示例 3:
输入:nums = [7,8,9,11,12]
输出:1
提示:
1 <= nums.length <= 5 * 10^5
-2^31 <= nums[i] <= 2^31 - 1
思路
常规方法其实就是先排序,然后再找最小缺失的正整数,但是这样时间复杂度为O(n*logn)。想要以O(n)的复杂度去完成的话,就是用哈希的思想了,数据长度为5*10^5,只要我们把出现的数按照其下标存起来,然后再遍历这个范围内的数,哪个下标没有存值也就代表哪个数字没有出现过。
AC代码
点击查看代码
public class Solution {
public int firstMissingPositive(int[] nums) {
int len = nums.length;
for(int i=0; i<len; i++) {
while( nums[i]>0 && nums[i]<=len && nums[nums[i]-1]!=nums[i] ) {
int num = nums[nums[i]-1];
nums[nums[i]-1] = nums[i];
nums[i] = num;
}
}
int index = 0;
for(; index<len; index++) {
if( nums[index]!=index+1 ) {
break ;
}
}
return index+1;
}
}