题解 | #缺失的第一个正整数#
缺失的第一个正整数
http://www.nowcoder.com/practice/50ec6a5b0e4e45348544348278cdcee5
用一个标记数组来记录1到n-1之间的数是否出现过,遍历完做完标记之后再遍历一遍数组,找出第一个标记值未改变的即是没有出现过的,
一般情况就是原数组中出现了小于n的数和大于n的数,那么就把小于n的数在标记数组中改变标记值,大于等于n的数不管
特殊情况:对于数组中的数刚好是1到n-1每个数都出现过一遍,那么没出现的第一个数就是n.
对于数组中的数均大于等于n时,标记数组完全没变化,没出现过的第一个数仍旧是n.
int minNumberDisappeared(int* nums, int numsLen ) {
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;
}
