力扣41 缺失的正数

devtools/2024/9/23 7:11:50/

给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。
请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。
示例 1:
输入:nums = [1,2,0]
输出:3
解释:范围 [1,2] 中的数字都在数组中。
示例 2:
输入:nums = [3,4,-1,1]
输出:2
解释:1 在数组中,但 2 没有。

数据结构:原数组
算法
本题是一道困难题,主要是因为要求空间复杂度为o(1),时间复杂度为o(n)。

这题最初的思路是用一个哈希表,将数组存入,然后从1开始找第一个哈希表中不存在的数就是缺失的正数。

上述做法空间复杂度明显不是常数级别,有没有什么办法使用原数组当做哈希表呢?那第一个要解决的问题就是长度,这题答案其实只能在【1,length+1】中出现,因为但凡有一个位置不是这个范围内的数,那就必定有一个这个范围内的数没出现。一个萝卜一个坑对不?

解决了第一个长度问题,那就还有如何映射的问题,也就是我怎么知道范围里的数有没有出现过。很好办,只要它出现了,我们就将它转换成下标,将对应的值转换为负值。那么最后没有变成负值的数,它对应的下标就是我们要找的范围里的数咯!

然后第二个问题还有一个小麻烦,就是事先要讲数组中的负数变为一个不可能出现的数防止干扰,同时在真正遍历的时候要加绝对值哦,看下面代码解释:

class Solution {public int firstMissingPositive(int[] nums) {for(int i = 0; i < nums.length; i++){if(nums[i] <= 0)nums[i] = nums.length+1;// System.out.print("//"+nums[i]);}for(int i = 0; i < nums.length; i++){// System.out.print("//"+nums[i]);//这里加绝对值是因为可能这个数还没用过,结果因为前面的数的下标映射过来变为负值int x = Math.abs(nums[i]);if(x <= nums.length)//加绝对值是因为可能出现重复数变回正值nums[x-1] = -Math.abs(nums[x-1]);}for(int i = 0; i < nums.length; i++){if(nums[i] > 0)return i+1;}return nums.length+1;}
}

http://www.ppmy.cn/devtools/53711.html

相关文章

Vim基础操作:常用命令、安装插件、在VS Code中使用Vim及解决Vim编辑键盘错乱

Vim模式 普通模式&#xff08;Normal Mode&#xff09;&#xff1a; 这是 Vim 的默认模式&#xff0c;用于执行文本编辑命令&#xff0c;如复制、粘贴、删除等。在此模式下&#xff0c;你可以使用各种 Vim 命令来操作文本。插入模式&#xff08;Insert Mode&#xff09;&#…

性能测试(五)—— 数据库性能测试-mysql

1 mysql性能测试的主要内容 MySQL数据库介绍MySQL数据库监控指标MySQL慢查询工作原理及操作SQL的分析与调优方法MySQL索引的概念及作用MySQL索引的工作原理与设计规范MySQL存储引擎MySQL实时监控MySQL集群监控方案MySQL性能测试的用例准备使用Jmeter开发MySQL性能测试脚本执行…

【问题记录】Ubuntu提示: “E: 软件包 gcc 没有可安装候选“

Ubuntu提示: "E: 软件包 gcc 没有可安装候选" 一&#xff0c;问题现象二&#xff0c;问题原因&解决方法 一&#xff0c;问题现象 在虚拟机Ubuntu中进行安装gcc命令时报错&#xff1a;“E: 软件包 gcc 没有可安装候选”: 二&#xff0c;问题原因&解决方法 …

公链常用的共识算法

1. 工作量证明&#xff08;Proof of Work, PoW&#xff09; 工作原理&#xff1a;要求节点&#xff08;矿工&#xff09;解决一个数学难题&#xff0c;这个过程称为挖矿。第一个解决难题的矿工将有权添加一个新的区块到区块链上&#xff0c;并获得一定数量的加密货币作为奖励。…

前端相关面试题--html

html是什么 html是超文本标记语言&#xff0c;与js和css一样&#xff0c;是由W3C&#xff08;万维网联盟&#xff09;制定的一套语言&#xff0c;超文本 指的是连接一个网站内或多个网站的网页的链接 标记是 html使用各种标记 来注明文本、图片、链接等 以便在浏览器这种进行 …

docker通过容器id查看运行命令;Portainer监控管理docker容器

1、docker通过容器id查看运行命令 参考&#xff1a;https://blog.csdn.net/a772304419/article/details/138732138 docker inspect 运行镜像id“Cmd”: [ “–model”, “/qwen-7b”, “–port”, “10860”, “–max-model-len”, “4096”, “–trust-remote-code”, “–t…

微服务 | Springboot整合Dubbo+Nacos实现RPC调用

官网&#xff1a;Apache Dubbo 随着互联网技术的飞速发展&#xff0c;越来越多的企业和开发者开始关注微服务架构。微服务架构可以将一个大型的应用拆分成多个独立、可扩展、可维护的小型服务&#xff0c;每个服务负责实现应用的一部分功能。这种架构方式可以提高开发效率&…

OCC介绍及框架分析

1.OCC介绍 Open CASCADE &#xff08;简称OCC&#xff09;是一开源的几何造型引擎&#xff0c;OCCT库是由Open CASCADE公司开发和市场运作的。它是为开源社区比较成熟的基于BREP结构的建模引擎&#xff0c;能够满足二维三维实体造型和曲面造型&#xff0c;国内研究和使用它的单…