描述
给定一个无重复元素的整数数组nums,请你找出其中没有出现的最小的正整数
进阶: 空间复杂度 O(1)O(1),时间复杂度 O(n)O(n)
数据范围:
−231≤nums[i]≤231−1−231≤nums[i]≤231−1
0≤len(nums)≤5∗1050≤len(nums)≤5∗105
示例1
输入:
[1,0,2]
返回值:
3
示例2
输入:
[-2,3,4,1,5]
返回值:
2
示例3
输入:
[4,5,6,8,9]
返回值:
1
用一个标记数组来记录1到n-1之间的数是否出现过,遍历完做完标记之后再遍历一遍数组,找出第一个标记值未改变的即是没有出现过的,
一般情况就是原数组中出现了小于n的数和大于n的数,那么就把小于n的数在标记数组中改变标记值,大于等于n的数不管
特殊情况:对于数组中的数刚好是1到n-1每个数都出现过一遍,那么没出现的第一个数就是n.
对于数组中的数均大于等于n时,标记数组完全没变化,没出现过的第一个数仍旧是n.
int* arr = (int*)malloc(sizeof(int) * numsLen);
int i = 0;
for(i = 0; i<numsLen; i++)
arr[i] = 0; //初始全标记为0
for(i = 0; i<numsLen; i++){
if(nums[i] > 0 && nums[i] <= numsLen)
arr[nums[i]-1] = 1; //改变标记值
}
for(i = 0; i<numsLen; i++){
if(arr[i] == 0) //寻找未出现的
break;
}
return i+1;
}