leetcode_41.缺失的第一个正数

41. 缺失的第一个正数

题目描述:给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。

请你实现时间复杂度为  O(n) 并且只使用常数级别额外空间的解决方案。

示例 1:

输入:nums = [1,2,0]
输出:3
解释:范围 [1,2] 中的数字都在数组中。

示例 2:

输入:nums = [3,4,-1,1]
输出:2
解释:1 在数组中,但 2 没有。

示例 3:

输入:nums = [7,8,9,11,12]
输出:1
解释:最小的正数 1 没有出现。

提示:

  • 1 <= nums.length <= 10^5
  • -2^31 <= nums[i] <= 2^31 - 1
代码一:
  1. 首先,对原数组进行了扩展操作,将其长度增加了1,并将新添加的元素设置为 -1。这样做的目的是为了处理边界情况,确保算法能够正确地处理数组中的所有元素。

  2. 然后,遍历数组,进行元素交换操作。对于数组中的每个元素 nums[i],如果它是一个正整数,并且它应该属于数组的有效范围(小于数组长度 len,大于0),并且它应该放在 nums[nums[i]] 的位置上(即 nums[i] 应该放在数组中的下标为 nums[i] 的位置上),同时保证交换的元素不是相同的。如果满足这些条件,就进行元素交换,并将循环变量 i 减1,以便重新检查交换后的 nums[i]。

  3. 第三个循环,从下标为1开始遍历数组。对于每个下标 i,如果 nums[i] 不等于 i,说明 i 是缺失的最小正整数,直接返回 i。

  4. 如果第三个循环完全执行完毕(即没有发现缺失的最小正整数),说明nums的数是连续的正整数,则返回数组的长度 len,即为下一个正整数。

class Solution {
    public int firstMissingPositive(int[] nums) {
        int n = nums.length;
        for (int i = 0; i < n; ++i) {
            if (nums[i] <= 0) {
                nums[i] = n + 1;
            }
        }
        for (int i = 0; i < n; ++i) {
            int num = Math.abs(nums[i]);
            if (num <= n) {
                nums[num - 1] = -Math.abs(nums[num - 1]);
            }
        }
        for (int i = 0; i < n; ++i) {
            if (nums[i] > 0) {
                return i + 1;
            }
        }
        return n + 1;
    }
}

 代码二:

  1. 第一个循环,遍历原数组,将所有小于等于 0 的元素都替换为 n + 1。这样做的目的是为了将数组中的非正整数排除在外,因为我们只关心正整数的缺失情况。

  2. 第二个循环,遍历数组中的每个元素,将对应的下标所表示的正整数置为负数。例如,如果当前元素是正整数 num,则将下标为 num - 1 的元素置为负数。这个操作的目的是通过修改数组元素的符号来表示对应的正整数是否出现过。如果某个正整数出现过,则对应的数组元素是负数;如果没有出现过,则对应的数组元素是正数。

  3. 第三个循环,遍历数组,找到第一个正数出现的位置,即为缺失的正整数。如果数组中没有正数,则返回 n + 1,因为前面的操作已经排除了非正整数,缺失的正整数肯定不会超过 n + 1。

整体思路是利用数组本身的符号来标记正整数的出现情况,通过遍历数组来找到第一个缺失的正整数。

class Solution {
    public int firstMissingPositive(int[] nums) {
        int len = nums.length;
        for (int i = 0; i < len; i++) if (nums[i] <= 0) nums[i] = len + 1;
        for (int i = 0; i < len; i++) {
            int temp = Math.abs(nums[i]);
            if (temp <= len) nums[temp - 1] = -Math.abs(nums[temp - 1]);
        }
        for (int i = 0; i < len; i++) if (nums[i] > 0) return i + 1;
        return len + 1;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/586685.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【MyBatis】 MyBatis框架下的高效数据操作:深入理解增删查改(CRUD)

&#x1f493; 博客主页&#xff1a;从零开始的-CodeNinja之路 ⏩ 收录文章&#xff1a;【MyBatis】 MyBatis框架下的高效数据操作&#xff1a;深入理解增删查改&#xff08;CRUD&#xff09; &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 My …

工具分享:免费一键生成像素风格头像神器

目录 引言神器介绍使用方法上传照⽚选择像素大小保存or分享图片生后图像处理功能娱乐功能 结语最后 引言 五一前一天和群友聊到换微信头像的事情&#xff0c;我就心想自己制作一些头像来用吧&#xff0c;起初是用的无界AI通过咒语来生成头像&#xff0c;但总不尽如人意。如下&…

TFLOPS和TOPS介绍

TFLOPS和TOPS都是衡量计算设备性能的单位&#xff0c;常用于评估处理器或加速器在科学计算、图形处理以及人工智能领域的运算能力。它们分别代表不同的运算类型&#xff1a; TFLOPS (Tera Floating Point Operations Per Second) TFLOPS用于衡量每秒执行的万亿次浮点运算数。…

「 网络安全常用术语解读 」软件物料清单SBOM详解

1. 概览 软件物料清单&#xff08;Software Bill of Materials&#xff0c;SBOM&#xff09;是软件成分信息的集合&#xff0c;SBOM文件中记录了软件产品或服务所使用组件、库、框架的清单&#xff0c;用于描述软件构建过程中使用的所有组件及其关系&#xff0c;以实现软件供应…

spring的高阶使用技巧1——ApplicationListener注册监听器的使用

Spring中的监听器&#xff0c;高阶开发工作者应该都耳熟能详。在 Spring 框架中&#xff0c;这个接口允许开发者注册监听器来监听应用程序中发布的事件。Spring的事件处理机制提供了一种观察者模式的实现&#xff0c;允许应用程序组件之间进行松耦合的通信。 更详细的介绍和使…

22 重构系统升级-实现不停服的数据迁移和用户切量

专栏的前 21 讲&#xff0c;从读、写以及扣减的角度介绍了三种特点各异的微服务的构建技巧&#xff0c;最后从微服务的共性问题出发&#xff0c;介绍了这些共性问题的应对技巧。 在实际工作中&#xff0c;你就可以参考本专栏介绍的技巧构建新的微服务&#xff0c;架构一个具备…

【Schrödinger薛定谔软件使用实战】- 4lyw蛋白实战

文章目录 软件选择1 pretein preparation1.1 import and process注意1.1.1 preprocess可能遇到的问题 1.2 review and modify1.3 refine1.3.1 optimize优化氢键网络1.3.2 minimize 氢原子会进行能量最小化 2 ligand prepare3 生成对接盒子-receptor grid generation3.1 recepto…

Q1营收稳健增长,云从科技如何在“百模大战”的险中求稳?

自从迈入大模型时代&#xff0c;AI行业可谓“一天一个样”。越来越多的企业涌现&#xff0c;舆论热议从未断绝。 但就像所有技术必须经历的那些考验&#xff0c;在现实尺度下&#xff0c;AI顺利走进商业化世界&#xff0c;仍然是少部分玩家掌握的稀缺能力。个中原因不尽相同&a…

第49期|GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以找…

javase学习01-GUI设计中的菜单条,菜单及菜单项(简单的实现)

目录 一&#xff0c;效果及代码 二&#xff0c;相关内容 1&#xff0c;创建图片资源文件夹 2&#xff0c;菜单初识 3&#xff0c;图标大小设置 4&#xff0c;菜单高度设置 5&#xff0c;设置窗口的图标 ☀ 今天学习了Java的GUI&#xff08;graphics user interface&…

C++入门基础(二)

目录 缺省参数缺省参数概念缺省参数分类全缺省参数半缺省参数声明与定义分离 缺省参数的应用 函数重载函数重载概念例子1 参数类型不同例子2 参数的个数不同例子3 参数的顺序不同 C支持函数重载的原理--名字修饰(name Mangling) 感谢各位大佬对我的支持,如果我的文章对你有用,欢…

报错“Install Js dependencies failed”【鸿蒙开发Bug已解决】

文章目录 项目场景:问题描述原因分析:解决方案:此Bug解决方案总结Bug解决方案寄语项目场景: 最近也是遇到了这个问题,看到网上也有人在询问这个问题,本文总结了自己和其他人的解决经验,解决了【报错“Install Js dependencies failed”】的问题。 报错如下 问题描述 …

量子信息杂谈系列(一):关于费曼学习法

小伙伴们劳动节快乐呀&#xff0c;放假这几天博主准备从工作中“逃离”出来&#xff0c;分享一些轻松的话题。 一转眼我在一个多月的时间已经输出了二十多篇博客了&#xff0c;这些博客编写过程中查阅资料、消化理论和文本的编写等工作几乎占据了我所有的业余时间&#xff0c;压…

Golang | Leetcode Golang题解之第62题不同路径

题目&#xff1a; 题解&#xff1a; func uniquePaths(m, n int) int {return int(new(big.Int).Binomial(int64(mn-2), int64(n-1)).Int64()) }

2024 五一杯高校数学建模邀请赛(B题)| 交通需求规划|建模秘籍文章代码思路大全

铛铛&#xff01;小秘籍来咯&#xff01; 小秘籍团队独辟蹊径&#xff0c;构建了这一题的详细解答哦&#xff01; 为大家量身打造创新解决方案。小秘籍团队&#xff0c;始终引领着建模问题求解的风潮。 抓紧小秘籍&#xff0c;我们出发吧~ 让我们看看五一杯的B题&#xff01; 完…

FSNotes for Mac v6.7.1中文激活:轻量级笔记管理工具

FSNotes for Mac&#xff0c;一款专为Mac用户打造的轻量级笔记管理工具&#xff0c;让您的笔记管理变得简单而高效。 FSNotes for Mac v6.7.1中文激活版下载 它采用Markdown文件格式&#xff0c;让您轻松创建和编辑富文本笔记&#xff0c;无需担心格式问题。同时&#xff0c;FS…

LabVIEW多通道数据采集系统

LabVIEW多通道数据采集系统 在当今的数据采集领域&#xff0c;随着技术的不断进步和应用需求的日益增长&#xff0c;对数据采集系统的速度、稳定性和灵活性要求也越来越高。基于千兆以太网和LabVIEW的多通道数据采集系统&#xff0c;以其高速的数据传输能力和强大的数据处理功…

《Redis使用手册之列表》

《Redis使用手册之列表》 目录 **《Redis使用手册之列表》****LPUSH&#xff1a;将元素推入列表左端****LPUSHX、RPUSHX&#xff1a;只对已存在的列表执行推入操作****LPOP&#xff1a;弹出列表最左端的元素****RPOP&#xff1a;弹出列表最右端的元素****RPOPLPUSH&#xff1a;…

解决iview(view ui)中tabs组件中使用图片预览组件ImagePreview,图片不显示问题

同学们可以私信我加入学习群&#xff01; 正文开始 前言一、问题描述二、原因分析三、解决方案总结 前言 最近在写个人项目的web端和浏览器插件&#xff0c;其中一个功能是base64和图片的转换。因为分成四个小功能&#xff0c;所以使用的iview的tabs来展示不同功能&#xff0c…

匠心精神与创新力量:构筑网络安全的新防线

一、匠心精神在网络安全中的重要性 匠心精神代表着对工作的专注和对质量的极致追求。在网络安全领域&#xff0c;这意味着对每一个安全漏洞的深入挖掘&#xff0c;对每一项安全技术的精心打磨。亿林网络李璐昆的提名&#xff0c;正是对其在网络安全领域匠心精神的认可。 二、…
最新文章