题目
给你一个未排序的整数数组,请你找出其中没有出现的最小的正整数。
示例 1:
输入: [1,2,0]
输出: 3
示例 2:
输入: [3,4,-1,1]
输出: 2
示例 3:
输入: [7,8,9,11,12]
输出: 1
提示:
你的算法的时间复杂度应为O(n),并且只能使用常数级别的额外空间。
解题思路
因为我们要找的数在 [1, N + 1] 里,最后 N + 1 这个元素我们不用找,只有在前面的 N 个元素都找不到的情况下,我们才返回 N + 1。所以我们可以把原始的数组当做哈希表来使用,将数值为 i 的数映射到下标为 i - 1 的位置,例如 1 这个数放到下标为 0 的位置, 2 这个数放到下标为 1 的位置,按照这种思路整理一遍数组。然后我们再遍历一次数组,第一个遇到的值不等于下标 +1 的那个数,那下标 +1 就是我们要找的缺失的第一个正数。如果遍历完数组也没找到,就返回 N + 1。
复杂度分析:
时间复杂度:O(N),其中 N 是数组的长度。
空间复杂度:O(1)。
代码
class Solution {
public int firstMissingPositive(int[] nums) {
int n = nums.length;
for(int i=0; i<n; i++){
// 满足在指定范围内、并且没有放在正确的位置上,才交换
// 例如:数值 3 应该放在索引 2 的位置上
while(nums[i]>=1 && nums[i]<=n && nums[i] != nums[nums[i]-1]){
// 交换两个数
int temp = nums[i];
nums[i] = nums[temp-1];
nums[temp-1] = temp;
}
}
for(int i=0; i<n; i++){
if(nums[i] != i+1){
return i+1;
}
}
return n+1;
}
}