当前位置: 首页 > news >正文

LeetCode热题100- 缺失的第一个正数【JavaScript讲解】

题目:在这里插入图片描述

解题一:

如果不考虑时间复杂度和空间复杂度的话,我们最先想到的办法是先将该数组进行排序和去重,将最初的res结果值设置为1;将然后进行遍历,如果第一项不为1,则返回1,否则根据遍历res++;遍历结束后发现每一项都符合要求则返回res的最终值。代码如下:

代码一:

/**
 * @param {number[]} nums
 * @return {number}
 */
var firstMissingPositive = function(nums) {
    nums = Array.from(new Set(nums));
    nums.sort((a,b)=>a-b);
    let res = 1;
    for(let i = 0; i < nums.length;i++){
        if(nums[i] > 0){
            if(nums[i] != res){
                return res;
            }
            res++;
        }
    }
    return res;
};

‌sort函数的时间复杂度为O(n log n),空间复杂度为O(n)
‌new Set操作的时间复杂度是O(n),空间复杂度也是O(n)‌
以上代码并没有满足题目要求的时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。

解题二:

我们这次使用了一个Set(numSet)来存储数组中出现过的正数。首先,我们遍历原数组nums,将每个在1到n范围内的正数添加到Set中。然后,我们再次遍历从1到n的每个数字,检查它是否在Set中出现过。如果找到一个没有出现过的数字,我们就返回它作为缺失的第一个正整数。如果所有1到n的数字都出现过,我们则返回n+1。

代码二:

/**
 * @param {number[]} nums
 * @return {number}
 */
var firstMissingPositive = function(nums) {
    let numSet = new Set();
    let n = nums.length;
    for(let i = 0; i < n;i++){
        if(nums[i] > 0 && nums[i] <= n){
            numSet.add(nums[i]);
        }
    }
    for(let i = 1; i <= n;i++){
        if(!numSet.has(i)){
            return i;
        }
    }
    return n + 1;
};

但是我们使用了一个额外的Set来存储出现过的数字,所以这里的空间复杂度为O(n);时间复杂度是O(n),因为我们只遍历了数组两次,并且Set的查找和插入操作都是O(1)的。

解题三:

将所有负数、0 都变为 N + 1,我们只需要考虑1-n的数字
遍历每个数,如果该数 |x| 属于[1,N];把在 x-1 的位置的数加上一个负号
遍历完之后,如果全部数都是负数——答案就是 1+N,否则就是第一个正数的位置+1

代码三:

/**
 * @param {number[]} nums
 * @return {number}
 */
var firstMissingPositive = function(nums) {
    let n = nums.length;
    for(let i = 0; i < n;i++){
       if(nums[i] <= 0) nums[i] = n + 1;
    }
    for(let i = 0; i < n;i++){
        let x = Math.abs(nums[i]);
        if(x >= 1 && x <= n){
            nums[x - 1] = nums[x - 1] < 0 ? nums[x - 1] : -nums[x - 1];
        }
    }
    for(let i = 0; i < n;i++){
        if(nums[i] >= 0) return i+1;
    }
    return n + 1;
};

此时就满足时间复杂度为o(n),空间复杂度为常数的代码了。此思路借鉴于力扣博主okkjoo,具体地址点击此处跳转。

当博主问朋友解决方案的时候,他二话不说的告诉我“用桶排啊!!”,于是,、、、、这篇文章到这里没有结束,,明天博主会尽快将桶排的方法补充上去,也欢迎小伙伴们在评论区留下你们的答案哦~~~~~

相关文章:

  • SpringMVC的工作原理
  • 基于Istio Ambient Mesh的无边车架构:实现零侵入式服务网格的云原生革命
  • ElasticSearch映射分词
  • vue3响应式丢失解决办法(三)
  • Leetcode Hot100 第30题 416.分割等和子集
  • CTM工具箱--系统美化工具箱
  • Leetcode100-春招-矩阵题类
  • 图论入门算法:拓扑排序(C++)
  • Copilot:Excel中的Python高级分析来了
  • C#控制台大小Console.SetWindowSize函数失效解决
  • AtCoder Beginner Contest 393(ABCDEF)
  • 苹果CMS站群插件的自动生成功能:提升网站流量的秘诀
  • DeepSeek R1 32B 本地部署实战
  • 解决“IndentationError: unexpected indent”错误
  • 【强化学习的数学原理】第07课-时序差分方法-笔记
  • 【Linux内核】进程管理(上)
  • DOS命令 setx 用法
  • MyBatis进阶
  • Spring的BeanFactory和FactoryBean有 什么不同
  • 基于矢量轨道角动量波的透射超表面设计
  • 上海虹桥国际咖啡文化节开幕,推出茶咖文化特色街区、宝妈咖啡师培训
  • 联合国报告:全球经济前景恶化,面临高度不确定性
  • 奥迪车加油时频繁“跳枪”维修两年未解决,4S店拒退换:可延长质保
  • 国台办:民进党当局刻意刁难大陆配偶,这是不折不扣的政治迫害
  • 重庆发布经济犯罪案件接报警电子地图,企业可查询导航属地经侦服务点
  • 习近平同巴西总统卢拉共同会见记者