缺失的第一个正数

news2025/7/13 8:57:13

题目链接

缺失的第一个正数

题目描述

注意点

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

解答思路

  • 关键是要实现时间复杂度为 O(n) 并且只使用常数级别额外空间,需要将数字出现情况存储再原数组上,思路为:假设数组的长度为n,遍历整个数组,当遍历到数字任意i位置时,此时的元素值为prev = nums[i],需要做以下操作:
    • 如果prev的值等于i + 1,则不做任何操作直接跳出循环(prev值已经处于应该放置的位置);如果prev的值不等于i + 1,此时需要将nums[prev - 1]与nums[i]的值进行交换(prev的值小于等于0或大于n时不考虑),也就是将prev值放在其应该放置的位置
    • 在将nums[prev - 1]的值设置成新值prev时,此时nums[i]的值为oldNum,则还需要对oldNum做上面相同的操作,将nums[oldNum]继续与nums[i]的值进行交换,以此类推,直到遍历到的元素都处于其应该放置的位置
  • 例子如下:
    • 遍历到位置0:[3,4,-1,1] -> [-1,4,3,1](数字3成功放置在下标2处)
    • 遍历到位置1:[-1,4,3,1] -> [-1,1,3,4] -> [1,-1,3,4](数字4成功放置在下标3,数字1成功放置在下标0)
    • 遍历到位置2:[1,-1,3,4]
    • 遍历到位置3:[1,-1,3,4]
  • 当所有的元素都处于其应该放置的位置后,再次遍历整个数组,找到第一个nums[i] != i + 1的位置,也就是缺失的第一个正数,如果所有的位置上都正确放置了元素,说明缺失的第一个正数为nums.length + 1
  • 需要注意的是,将某个值放在其应该放置的位置时,如果值小于等于0或大于n时可以不考虑,原因是:负数的情况不需要考虑;而如果是正数且该正数大于数组长度时,说明在该正数之前一定会有一个比其更小的正数缺失(否则数组的长度会大于n),其对寻找缺失的第一个正数也不会产生影响

代码

class Solution {
    public int firstMissingPositive(int[] nums) {
        int n = nums.length;
        // 使nums[i - 1] = i
        for (int i = 0; i < n; i++) {
            int prev = nums[i];
            while (prev - 1 >= 0 && prev - 1 < n && nums[prev - 1] != prev) {
                swap(nums, i, prev - 1);
                prev = nums[i];
            }
        }
        for (int i = 0; i < n; i++) {
            if (nums[i] != i + 1) {
                return i + 1;
            }
        }
        return n + 1;
    }

    public void swap(int[] nums, int left, int right) {
        int tmp = nums[left];
        nums[left] = nums[right];
        nums[right] = tmp;
    }
}

关键点

  • 原地哈希的思路

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Instagram 运营技巧,这4个基本设置很重要!

ins这个平台相信很多跨境卖家都不陌生&#xff0c;但想要运营好这个平台却不是那么容易的。想要在ins上获得更多的自然流量&#xff0c;基本设置和功能就要搞懂&#xff0c;今天就给大家分享4个基本的ins设置&#xff0c;以及如何更好地使用 Hashtag&#xff01; Instagram Bio…

在防御CC攻击上,高防CDN起着什么作用?

在当今数字化世界中&#xff0c;网络安全攻击已经成为普遍而严峻的威胁。特别是分布式拒绝服务攻击&#xff08;DDoS&#xff09;和CC攻击&#xff0c;它们有潜力使网络服务陷入完全瘫痪状态。为了应对这些威胁&#xff0c;采用高级防御CDN&#xff08;内容传递网络&#xff09…

Navicat连接postgresql数据库 -->华为云服务器

Navicat连接postgresql数据库 -->华为云服务器 2.开放服务器端口&#xff1a;54323.Navicat连接postgresql数据库 2.开放服务器端口&#xff1a;5432 1-1.选择安全组 1-2. 添加规则 1-3.开放5432端口规则 1-4.查看规则 3.Navicat连接postgresql数据库

自动化测试入门 —— 自动化测试概论

整篇论述总的来讲会很长&#xff0c;从自动化的思维、模型、工具&#xff0c;到各层次的自动化测试技术、测试框架、测试平台&#xff0c;包括面向未来的自动化技术都将涉及&#xff0c;因此打算拆成几个部分去写。此外&#xff0c;由于涉及的范围比较广泛&#xff0c;部分内容…

英飞凌TC3xx-Overlay

目录 1.数据访问重定向 2.寄存器说明 3.Overlay功能配置 3.1 确认用于重定向的CPU 3.2 配置重定向Block大小 3.3 配置目标地址和重定向地址 4.结果验证 5.小结 今天说要开个专栏讲讲XCP标定&#xff0c;但在将标定之前&#xff0c;先把英飞凌专门为标定功能设计overlay…

应用RFID标签实现工业智能制造生产线的可视化管理

随着自动化和信息化的不断推广&#xff0c;工业智能化成为了备受关注的话题&#xff0c;对于企业来说&#xff0c;生产线上的工艺流程和各个环节的信息是至关重要的&#xff0c;在物联网感知层中&#xff0c;RFID作为重要的核心组成部分&#xff0c;通过非接触式的无感知识别和…

WebSocket协议在java中的应用

文章目录 一、WebSocket介绍1.Http和WebSocket比较&#xff1a;2.应用场景 二、WebSocket使用步骤1.客户端搭建2.导入maven坐标3.导入WebSocket服务端组件WebSocketServer&#xff0c;用于和客户端通信1.ServerEndpoint2.OnOpen3.OnMessage4.OnClose 4.导入配置类WebSocketConf…

直流高压发生器技术特点

武汉凯迪正大直流高压发生器产品技术特点&#xff1a; 1、体积更小、重量更轻、更美观、更可靠、操作简便、功能齐全&#xff0c;便于野外使用。 2、采用PWM中频脉宽调制技术、脉冲串逻辑阵列调制&#xff0c;采用大功率IGBT器件和电压大反馈&#xff0c;从而使输出高压稳定度…

【C语法学习】8 - puts()函数

文章目录 1 函数原型2 参数3 返回值4 输出机制5 示例 1 函数原型 puts()&#xff1a;将str指向的内存空间中存储的字符串发送至标准输出流stdout&#xff0c;函数原型如下&#xff1a; int puts(const char *str)2 参数 puts()函数的参数只有一个str&#xff1a; str是一个…

MySQL数据库连接工具—MySQL Workbench

关于 MySQL Workbench 设计 MySQL Workbench 是数据库架构师、开发人员和 DBA 的统一可视化工具。MySQL Workbench 为服务器配置、用户管理、备份等提供了数据建模、SQL 开发和全面的管理工具。MySQL Workbench 可在 Windows、Linux 和 Mac OS X 上使用。 开发 MySQL Workb…

修复国产电脑麒麟系统开机出现initramfs 问题

目录预览 一、问题描述二、原因分析三、解决方案四、知识点呀initramfsBusyBox 五、参考链接 一、问题描述 国产麒麟系统出现 initramfs 模式 二、原因分析 一般在拷贝卡顿过程【强制关机】或者电【脑异常断电】的情况下概率性导致系统分区损坏&#xff0c;重启后大概率就会进…

体制内一定要懂“偷懒”,太努力的人走不远

体制内永远有写不完的材料&#xff0c;写的头疼&#xff0c;还要一直改改改&#xff01;家人们谁懂啊&#xff1f;&#xff1f; 真心建议体制内需要写材料的姐妹&#xff01;狠狠用这个写材料工具&#xff0c;保你写的又快又好还对你竖大拇指&#xff01; 介个工具嘎嘎好使&a…

ROSE65 R2蓝牙5.2双模热插拔PCB

键盘使用说明索引&#xff08;均为出厂默认值&#xff09; 软件支持&#xff08;驱动的详细使用帮助&#xff09;一些常见问题解答&#xff08;FAQ&#xff09;请认真阅读本说明首次使用步骤蓝牙配对规则&#xff08;重要&#xff09;蓝牙和USB切换键盘默认层默认触发层0的FN键…

MASK-RCNN tensorflow环境搭建

此教程默认你已经安装了Anaconda&#xff0c;且tensorflow 为cpu版本。为什么不用gpu版本&#xff0c;原因下面解释。 此教程默认你已经安装了Anaconda。 因为tensorflow2.1后的gpu版&#xff0c;不支持windows。并且只有高版本的tensorflow才对应我的CUDA12.2&#xff1b; 而…

重拾线形代数的记忆

关于这里面上下为什么相等起了疑惑&#xff08;线形代数还给老师了&#xff09;&#xff1a; 证明&#xff1a; I是单位阵&#xff0c;u是列向量&#xff0c;加撇表共轭转置。 考虑U u u’ 的特征系统&#xff1a; u ⟂ x时&#xff0c;U x 0 0 x。u ∥ x 时&#xff0c;…

【k8s】pod集群调度

调度约束 Kubernetes 是通过 List-Watch **** 的机制进行每个组件的协作&#xff0c;保持数据同步的&#xff0c;每个组件之间的设计实现了解耦。 用户是通过 kubectl 根据配置文件&#xff0c;向 APIServer 发送命令&#xff0c;在 Node 节点上面建立 Pod 和 Container。…

项目管理>时间管理

某项目包括A、B、C、D四道工序&#xff0c;各道工序之间的衔接关系。正常进度下各工序所需的时间和直接费用、赶工进度下所需的时间和直接费用如下表所示。该项目每天需要的间接费用为4.5万元。根据此表&#xff0c;以最低成本完成该项目需要&#xff08; &#xff09;天。 这…

4.5 Object类

思维导图&#xff1a; 4.5 Object类笔记总结 1. 定义和重要性 Java提供的Object类是所有Java类的根类。直接或间接&#xff0c;所有的Java类都继承自Object类。它被称为超类。 2. 默认行为 当创建一个新的类且没有显式地使用extends关键字指定一个父类时&#xff0c;该类默认…

C++核心编程之类和对象--C++运算符重载

目录 一、运算符重载 二、加号运算符重载 三、左移运算符重载 将类中的成员设置为私有属性&#xff0c;将全局函数设置为友元访问类中的成员 四、递增运算符 五、赋值运算符重载 六、关系运算符重载 七、函数调用运算符重载 一、运算符重载 对已有的运算符进行重新定义…

So-vits-SVC4.1

So-vits-SVC官方项目地址&#xff1a;https://github.com/svc-develop-team/so-vits-svc 中文版&#xff1a;https://github.com/SUC-DriverOld/so-vits-svc-Chinese-Detaild-Documents 教程&#xff1a;https://www.bilibili.com/video/BV1Hr4y197Cy/ 音频处理 1.转mp4/mp…