JavaScript 解法

方法一 、哈希表

具体做法

  • step 1:构建一个哈希表,用于记录数组中出现的数字。
  • step 2:从1开始,遍历到n,查询哈希表中是否有这个数字,如果没有,说明它就是数组缺失的第一个正整数,即找到。
  • step 3:如果遍历到最后都在哈希表中出现过了,那缺失的就是n+1.

过程可以看注释


function minNumberDisappeared( nums ) {
    // write code here
    let map = new Map() // 创建哈希表
    let len = nums.length // 数组长度
    for(let i = 0; i< len; i++){
        if(!map.has(nums[i])) map.set(nums[i], 1) // 将nums的值存入哈希表
    }
    let res = 1  // 默认最小正整数为 1
    while(map.has(res)){
       res++
    }
   // 如果nums的值都是在 1 - len 范围内,则最小值是 len+1 ,
  // 如果1-len内有空缺的值,则最小正整数是这第一个空缺的值
  //如果 nums 都是负数或者最小值大于 len 这返回的最小整数是1,
    return res 
}

alt

方法二 、 原地数组哈希

具体做法:

  • step 1:我们可以先遍历数组将所有的负数都修改成n+1。
  • step 2:然后再遍历数组,每当遇到一个元素绝对值不超过n时,则表示这个元素是1~n中出现的元素,我们可以将这个数值对应的下标里的元素改成负数,相当于每个出现过的正整数,我们把与它值相等的下标都指向一个负数,这就是类似哈希表的实现原理的操作。
  • step 3:最后遍历数组的时候碰到的第一个非负数,它的下标就是没有出现的第一个正整数,因为它在之前的过程中没有被修改,说明它这个下标对应的正整数没有出现过。
function minNumberDisappeared(nums) {
  // write code here
  // write code here
    let len = nums.length
    //遍历数组
    for(let i = 0;i<len;i++){
         //负数全部记为len+1 len+1后绝对值都大于len
        if(nums[i] <=0) nums[i] = len +1
    }
    for(let i = 0;i<len;i++){
         //对于z值在1-len之间的数字
        if(Math.abs(nums[i]) <=len) {
             //这个数字的下标标记为负数
            nums[Math.abs(nums[i]) -1] = -Math.abs(nums[Math.abs(nums[i]) - 1])
        }
    }
    for(let i =0; i<len;i++){
        //找到第一个元素不为负数的下标, 没有则是nums的值都大于len或为负数。
        if(nums[i] > 0) return i + 1
    }
    return len + 1
}

alt