继续每日一题

今天给大家带来一道将数组视为哈希表的算法

题目描述:

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

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

由于题目要求我们「只能使用常数级别的空间」,而要找的数一定在 [1, N + 1] 左闭右闭(这里 N 是数组的长度)这个区间里。因此,我们可以就把原始的数组当做哈希表来使用。事实上,哈希表其实本身也是一个数组;

最小正整数从1开始,那么没有出现的最小正整数一定在1到n+1之间(因为如果1到n都出现了,那么答案就是n+1)

所以我们可以只考虑数组中的1到n之间的数,负数、0和大于n的数可以忽略(因为它们不影响1到n之间的最小缺失正整数)。

考虑到对时间和空间复杂度的要求,我们可以采用原地置换,具体流程通过文字描述不太直观,下面通过一个case给大家描述一下:

数组 [3,4,-1,1]

  • i=0,nums[0]=3,它应该在位置2(即下标2),交换nums[0]和nums[2]:得到[-1,4,3,1]
    然后i=0,此时nums[0]=-1,不在1到4范围内,跳过。

  • i=1,nums[1]=4,它应该在位置3,交换nums[1]和nums[3]:得到[-1,1,3,4]
    然后i=1,此时nums[1]=1,它应该在位置0,但是位置0是-1,交换:得到[1,-1,3,4]
    然后i=1,现在nums[1]=-1,跳过。

  • i=2,nums[2]=3,在位置2(正确),跳过。

  • i=3,nums[3]=4,在位置3(正确),跳过。

然后遍历数组

  • i=0,num[0]=1(正确);
  • i=1,num[1]=-1,但实际上i=1,对应的数是2,所以返回i+1

但是在置换过程中可能会存在当前位置和要置换的位置的数值是相同的,导致死循环,所以在置换之前还需要比较两个值是否相同

核心逻辑如下:

  • 当前元素:currentVal=nums[i]
  • 当前元素需要在的位置:index=currentVal - 1,因为数组下标从0开始,所以需要减一
  • 要置换的元素:nums[index]
while (true) {int currentVal = nums[i];//当前元素需要置换到该位置,数组下标从0开始,所以需要减一int changeIndex = currentVal - 1;int needChangeVal = nums[changeIndex];if (currentVal < 1 || currentVal > n) {//不在有效范围无需置换break;}int needChangeVal = nums[changeIndex];if (currentVal == needChangeVal) {//两个数字相等,无需置换break;}nums[i] = needChangeVal;nums[changeIndex] = currentVal;}

完整代码如下:

    public static int firstMissingPositive(int[] nums) {int n = nums.length;for (int i = 0; i < n; i++) {while (true) {int currentVal = nums[i];//当前元素需要置换到该位置,数组下标从0开始,所以需要减一int changeIndex = currentVal - 1;if (currentVal < 1 || currentVal > n) {//不在有效范围无需置换break;}int needChangeVal = nums[changeIndex];if (currentVal == needChangeVal) {//两个数字相等,无需置换break;}nums[i] = needChangeVal;nums[changeIndex] = currentVal;}}for (int i = 0; i < n; i++) {int currentVal = nums[i];if (currentVal != i + 1) {return i + 1;}}//如果都存在则返回 n+1return n + 1;}

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

单例模式-Python示例

单例模式 单例模式&#xff08;Singleton Pattern&#xff09;是设计模式中一种创建型模式&#xff0c;广泛应用于软件开发中。一以下以故事化的方式&#xff0c;结合详细的技术讲解&#xff0c;介绍单例模式的背景、定义、适用场景&#xff0c;并提供python的示例代码。 故事…

啥是 SaaS

https://www.youtube.com/watch?vnpcL7oRZQlI这个视频讲了什么东西&#xff0c; 什么 idea?好的&#xff0c;这个视频内容非常棒&#xff0c;信息量很足。下面为你详细总结视频讲了什么&#xff0c;以及核心的 Idea 是什么。 视频核心 Idea 这个视频讲的是一位名叫 Leandro…

Spring Boot 工程启动以后,我希望将数据库中已有的固定内容,打入到 Redis 缓存中,请问如何处理?

在 Spring Boot 工程中&#xff0c;将数据库中的固定内容预先加载到 Redis 缓存中可以通过以下步骤实现。这里假设你已经配置好了 Spring Data Redis 和数据库&#xff08;如 MySQL&#xff09;的连接。 1. 添加依赖 首先&#xff0c;确保你的 pom.xml&#xff08;Maven&…

springboot企业级项目开发之项目测试——集成测试!

集成测试 集成测试是指项目代码在单元测试完成后进行的第二阶段测试。集成测试的重点是在集成组件或单元之间交互时暴露缺陷&#xff0c;以保证不同模块之间相互调用的正确性。在Spring Boot的项目集成测试中&#xff0c;将测试Controller和Dao的完整请求处理。应用程序在服务…

HTML 媒体(Media)

HTML 媒体&#xff08;Media&#xff09; 引言 HTML 媒体元素是构成现代网页的重要组成部分&#xff0c;它允许我们在网页中嵌入各种类型的媒体内容&#xff0c;如音频、视频、图像等。这些元素不仅丰富了网页的视觉效果&#xff0c;还提升了用户体验。本文将详细介绍 HTML 媒…

轻量化分布式AGI架构:基于区块链构建终端神经元节点的互联网智脑

一、架构概述 该架构通过将终端设备&#xff08;如手机、IoT设备&#xff09;转化为神经元节点&#xff0c;结合区块链技术构建去中心化智能网络&#xff0c;形成“互联网智脑”。其核心在于突破传统AGI算力瓶颈&#xff0c;实现数据安全共享与价值分配。 1.1 关键特征 分布…

【知识图谱构建系列6】:借了张显卡先跑着

文章目录 前情提要mistral模型运行代码前情提要 之前咱对LLM4KGC的代码稍作修改,目标是用modelscope来下载模型。 现在这个代码终于能跑了。 前面咱说,我们的显卡只有6G的显存。现在呢,我也成功借到了A100的显卡。这下,咱可以先跑跑这个项目默认带的mistral模型。 mist…

从零开始手写redis(16)实现渐进式 rehash map

手写 Redis 系列 java从零手写实现redis&#xff08;一&#xff09;如何实现固定大小的缓存&#xff1f; java从零手写实现redis&#xff08;三&#xff09;redis expire 过期原理 java从零手写实现redis&#xff08;三&#xff09;内存数据如何重启不丢失&#xff1f; jav…

List、Queue、Deque、Stack常用方法总结

Java 中几个常见的线性数据结构的 方法总结与对比&#xff0c;包括&#xff1a; List&#xff08;ArrayList、LinkedList&#xff09;Queue&#xff08;LinkedList、PriorityQueue&#xff09;Deque&#xff08;ArrayDeque、LinkedList&#xff09;Stack&#xff08;传统 Stac…

github为InfiniSynapse Docker提PR过程留档@Windows10

为InfiniSynapse Docker提了一个PR&#xff1a;修改阿里源为清华源&#xff0c;并不再安装PPA。 by skywalk163 Pull Request #1 chaozwn/infini_docker 整体操作 提PR的前置动作 先fork要提PR的项目git clone到本地用VSCode修改代码 提交PR git add . git commit -m &…

搭建加解密网站遇到的问题

本机向云服务器传输文件 用winscp 服务器在安装 SSH 服务时自动生成密钥对&#xff08;公钥私钥&#xff09; 为什么要有指纹验证&#xff1f; 防止中间人攻击&#xff08;Man-in-the-Middle&#xff09; 指纹验证打破这个攻击链&#xff1a; 小问题 安装python时 ./confi…

Docker高级管理--容器通信技术与数据持久化

第一节&#xff1a;容器通信技术 一&#xff1a;Docker 容器的网络模式 当项目大规模使用 Docker 时&#xff0c;容器通信的问题也就产生了。要解决容器通信问题&#xff0c;必须先了解很多关于网络的知识。Docker 的网络模式非常丰富&#xff0c;可以满足不同容器的通信要求&…

jsons.top工具之数组交集、去重

作为一名程序员&#xff0c;一款高效的 在线转换工具 &#xff08;在线时间戳转换 计算器 字节单位转换 json格式化&#xff09;必不可少&#xff01;https://jsons.top 用js实现一个轻量级的集合运算工具&#xff0c;可以对数组、集合去重、求交并差集&#xff0c;找出两个集…

Vue3 + Tailwind CSS 后台管理系统教程

Vue3 搭配 Tailwind CSS 是构建现代后台管理系统的绝佳组合。Vue3 提供了高效的响应式框架&#xff0c;而 Tailwind CSS 则让样式编写变得快速且灵活。下面我将分步骤教你如何创建一个功能完整的后台管理系统。 第 1 步&#xff1a;创建项目 首先&#xff0c;我们需要使用 Vit…

ComfyUI遭“Pickai“C++后门攻击,全球700余台AI图像生成服务器沦陷

大规模AI基础设施遭遇定向攻击 网络安全研究机构XLab近日发现针对ComfyUI框架的活跃攻击活动。ComfyUI是当前广泛用于部署大型AI图像生成模型的开源框架。攻击者通过该框架漏洞植入名为Pickai的C后门程序&#xff0c;已导致全球近700台服务器失陷。中国国家网络安全通报中心于…

Unity_VR_如何用键鼠模拟VR输入_PICO项目配置

文章目录 [TOC] 一、创建项目1.直接创建VR核心模板&#xff08;简单&#xff09;2.创建3D核心模板导入XR包&#xff08;并配置pico&#xff09;&#xff08;1&#xff09;创建项目&#xff08;2&#xff09;导入PICO的SDK&#xff08;3&#xff09;启用 PICO XR 插件&#xff0…

站点天下--网站在线和SSL过期监控的可靠助手

简介 网站突然访问不了、HTTPS证书到期&#xff0c;如果不能及时发现&#xff0c;将蒙受损失~ 站点天下提供应用在线状态监控和SSL证书到期监控&#xff1a; 若访问不了或SSL证书即将到期&#xff0c;则立即发邮件通知&#xff01;可以在线查看应用的在线状态和SSL证书到期时…

React setState原理

异步更新 原因 1设置为异步提升性能 如果setState每次调用直接执行&#xff0c;会造成 render 函数被频繁执行 &#xff0c;页面重新被渲染 解决&#xff1a;异步批处理 2如果render函数未执行时&#xff0c;保证props和state一致性 拿到最新state的方法 法一:setState&…

汉代大模型:历史镜像与智能重构的深度对话

引言&#xff1a;当历史遇见人工智能 一件汉代陶俑的三维模型正通过增强现实技术向观众演绎农耕场景。这个看似寻常的文物活化案例&#xff0c;实则蕴含着人工智能与历史学交叉领域的前沿探索——汉代大模型。作为连接过去与未来的智能载体&#xff0c;汉代大模型不仅重构了我…

es向量检索里的efSearchc参数是干嘛用的

在Elasticsearch的向量检索中&#xff0c;ef_search&#xff08;或efSearch&#xff09;是控制HNSW近似最近邻&#xff08;ANN&#xff09;搜索精度与性能平衡的关键参数&#xff0c;其作用机制和影响如下&#xff1a; &#x1f6e0;️ 一、核心作用 ef_search 限制底层图遍历…