缺失的第一个正整数

289 阅读1分钟

描述

给定一个无重复元素的整数数组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;
}