Javascript每天一道算法题(十七)——缺失的第一个正整数_困难


前言

提示:


1、问题

给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。
请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。

看了很久示例才看明白说了啥。
首先正整数说大于0的数字,如1、2、3、4、5…
如示例1 [0,1,2]. 返回3 因为1,2数组中有了,所以最小的为3
示例2[-1,1,3,4] 返回2。因为1和3 之间没有2,2就是那个丢失的第一个正整数
示例3 [7,8,9,11,12] 因为没有正整数1,所以1就是那个丢失的第一个正整数

2、示例

示例 1:
输入:nums = [1,2,0]
输出:3
示例 2:
输入:nums = [3,4,-1,1]
输出:2
示例 3:
输入:nums = [7,8,9,11,12]
输出:1

3、解决方法

(1)方法1

let nums = [3,4,-1,1]
var firstMissingPositive = function(nums) {
    
    
    let min = 1; // 1:定义一个可能返回的最小正整数
    nums.sort((a,b) => a-b) // 2: 排序
    let newArray = [] // 3: 定义一个接收正整数的数组
    // 4:第一次遍历:
    nums.forEach((item, index) => {
    
    
        // 4: 将数组中大于等于1 并且 小于数组长度的值 存入新数组
        // 如示例二新数组为[1, empty, 3]
        if(item >= 1 && nums[index] < nums.length){
    
    
            newArray[nums[index] - 1] = nums[index]
        }
    });
    console.log('zzz', nums, newArray);
    // 5:第二次遍历:检查下标是否喝值相对应(下标+1 === 当前下标的值)
    for(let i=0;i<newArray.length;i++){
    
    
        // 5-1:如果不等于说明当前下标+1就是缺少正整数的值
        if(newArray[i] != i + 1){
    
    
            min = i + 1
            break;
        } else {
    
    
            // 5-2:如果都符合条件,就如示例一中[1,2]都符合条件,所以最小的值就是当前下标+1 + 1
            // 下标是从0开始的,当前值下标为 i+ 1(包括最后一个值),比最后一个值下标还大的就是i+2了
            // 如示例[1,2]中2的下标为1,要等于这个值就是下标+1,要大于这个值就是下标+2
            // 为什么不直接使用当前item的值呢?由于是用下标插入的,所以item的值可以为 empty
            min = i + 2
        }
    }
    console.log('mew', min); // 6:返回缺失的最小正整数
};
firstMissingPositive(nums)

总结

(1)难度: 困难
(2)思路:遍历一次数组把大于等于1的和小于数组长度大小的值放到新数组(newArray)对应位置,然后再遍历一次数组查当前下标是否和值对应,如果不对应那这个下标+1就是答案,否则遍历完都没出现那么答案就是当前下标加2。
(3)注意点:为什么要下标+1和+2在第五步有详细说明

猜你喜欢

转载自blog.csdn.net/weixin_44784401/article/details/134603394