给你一个未排序的整数数组 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 * 105
-231 <= nums[i] <= 231 - 1
思路:
在一个长度为N的数组中,未出现的最小正整数只可能是N+1,或者是[1, N]中的某个数
首先排除负数,将所有的负数和0都变为N + 1
然后再遍历整个数据,将数组中出现过的数值为x,x属于[1, N],将(x-1)位置上的数值置为(-|x|)绝对值的负数,表示下标加一的数字在数组中出现过
最后,遍历整个数组,找到第一个数值大于0的下标,返回下标+1;若未找到,则表明[1, N]在数组中都出现过了,则返回N + 1
int firstMissingPositive(int* nums, int numsSize){
for(int i = 0; i < numsSize; i++){
if(nums[i] <= 0)
nums[i]= numsSize + 1;
}
int num = 0;
for(int i = 0; i < numsSize; i++){
num = abs(nums[i]);
if(num <= numsSize)
nums[num - 1] = -abs(nums[num - 1]);
}
for(int i = 0; i < numsSize; i++){
if(nums[i] > 0)
return i + 1;
}
return numsSize + 1;
}