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
}
方法二 、 原地数组哈希
具体做法:
- 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
}