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

力扣 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 <= 105
  • -231 <= nums[i] <= 231 - 1

题解

考虑将每一个元素x放在对应位置的下标处,比如,元素值x等于3,就放在下标为2的位置,因此数组3,2,1在重新放置之后们就会成为:1,2,3,即元素x放在下标为x-1的位置。

遍历一遍数组,如果发现现在i位置的元素值x不等于i+1,说明现在需要进行元素交换,让元素x放在它本来应该放置的位置x-1处,可以使用自定义的交换函数change(nums,i,x-1),即让i位置元素和x-1位置元素进行交换。

但是注意,交换之前,我们需要确定,现在i位置元素是否是正整数,如果不是的话,对于一个负数或0来说,在我们最终的数组中实际是没有该元素的位置的,因此交换操作不需要对负数和0进行操作,如果遍历到负数或0直接跳过;

其次,如果现在数组大小是4,即下标范围值[0,3],但是某一个数组元素值为7,该元素需要放置在下标为6的位置,但是数组放不下,因此这种情况也不需要进行交换排序,直接跳过。

综上所述,最终需要进行排序的前提条件是:

1、当前元素大小小于等于数组大小

2、当前元素值>=1

3、当前元素没有放在它实际应该放置的位置,即nums[i]!=nums[nums[i]-1]

在一次交换之后,当前位置上是否就是应该放置的值,这也是不确定的,因此上面我们实现的是将i位置的值放在正确的位置上,但是交换之后的值是否在正确的位置上还是不确定的,因此还需要继续交换,所以这里判断是否需要交换的条件要使用while循环而不是if循环。

使用while循环进行是否可以进行交换的判断的时候,如果出现重复元素在原数组中出现,那么也可以正常进行判断交换,因为,一旦其中一个元素交换到正确的位置上,那么下一个元素进行while判断的时候,nums[i]!=nums[nums[i]-1的条件就不满足,自然不会造成死循环,同时这里使用的是判断当前位置的值是否放在正确位置,而不是当前位置是否放置正确元素,因为现在遍历到当前位置,能确定的就是当前位置的值,以及当前位置的元素应该放到哪里,但是不能确定当前位置应该放置的元素现在在数组的什么位置,因此该判断条件要这么写。

代码实现

 public static int firstMissingPositive(int[] nums) {//原地排序数组,将值为x的元素放在下标x-1的位置for (int i = 0; i < nums.length; i++) {while(nums[i]>=1&&nums[i]<=nums.length&&nums[i]!=nums[nums[i]-1]){check(nums,i,nums[i]-1);}}for (int j = 0; j < nums.length; j++) {if(nums[j]!=j+1){return j+1;}}return nums.length+1;}public static void check(int[] a,int i ,int j){int temp = a[i];a[i] = a[j];a[j] = temp;}

知识点

对于这种数组交换来实现每一个元素都在自己应该在的位置的想法一开始觉得不能实现,因为觉得交换之后现在位置上的元素可能还是不满足要求,再进行交换,会不会将之前排好序的位置打乱,实际上,这样的担忧是不必要的,因为每个元素只有一个确定的位置,要么能够交换就交换的放置,要么因为在当前数组放不下该元素或者该元素小于1就不交换,总之,只要在while判断条件下进行的交换总能将新交换到当前位置的元素再交换到正确的位置,直到新交换到当前位置的元素已经不满足要交换的条件了,继续遍历下一个元素进行新一轮的交换即可。

相关文章:

力扣 41.缺少的第一个正整数

题目描述&#xff1a; 给你一个未排序的整数数组 nums &#xff0c;请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,0] 输出&#xff1a;3 解释&#xff1a;范围 …...

Git从入门到放弃

由于我的Git学的不太好&#xff0c;所以为了能够将以后我的学习笔记能够整理的更好&#xff0c;我先要系统的学习一下git&#xff0c;文章由此产生。 文章笔记源自尚硅谷Git入门到精通全套教程视频内容 1 进入官网 学习新技术的第一步需要熟悉官网&#xff0c;Git也不例外。ht…...

003.数据分析_PandasSeries对象

我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448; 入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448; 虚 拟 环 境 搭 建 &#xff1a;&#x1f449;&…...

【介绍下什么是Kubernetes编排系统】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…...

linux防止nmap扫描

1、首先关闭Centos7自带的firewalld [rootnode ~]# systemctl disable firewalld.service && systemctl stop firewalld.service 2、安装iptables服务 [rootnode ~]# yum install iptables-services iptables-devel -y [rootnode ~]# systemctl enable iptables …...

基于SpringBoot的装饰工程管理系统源码数据库

如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统装饰工程项目信息管理难度大&#xff0c;容错率低&#xff0c;管…...

2024前端面试准备2-JS基础知识回顾

变量类型和计算 1.值类型和引用类型的区别 常见值类型:undefined(定义undefined只能用let,不能用const)、字符串、bool、number、 Symbol; 常见引用类型: 对象, 数组、null(特殊引用类型,指针指向为空地址) 、function(特殊引用类型); 值类型的值直接存储在栈中;引用类型值存储…...

C++ 环形链表(解决约瑟夫问题)

约瑟夫问题描述&#xff1a; 编号为 1 到 n 的 n 个人围成一圈。从编号为 1 的人开始报数&#xff0c;报到 m 的人离开。下一个人继续从 1 开始报数。n-1 轮结束以后&#xff0c;只剩下一个人&#xff0c;问最后留下的这个人编号是多少&#xff1f; 约瑟夫问题例子&#xff1a;…...

【微信小程序】模板语法

数据绑定 对应页面的 js 文件中 定义数据到 data 中&#xff1a; 在页面中使用 {{}} 语法直接使用&#xff1a; 事件绑定 事件触发 常用事件&#xff1a; 事件对象的属性列表&#xff08;事件回调触发&#xff0c;会收到一个事件对象 event&#xff0c;它的详细属性如下&…...

深入了解 C 语言 Bug

目录 一、引言二、Bug的定义三、Bug的由来四、Bug的影响五、应对 Bug 的方法六、结论 一、引言 1、在 C 语言的编程世界中&#xff0c;Bug 是一个我们无法回避的话题。 2、Bug&#xff0c;简单来说&#xff0c;就是程序中存在的错误或缺陷。它可以表现为程序运行结果的异常、崩…...

Redis 内存回收

文章目录 1. 过期key处理1.1 惰性删除1.2 周期删除 2. 内存淘汰策略 Redis 中数据过期策略采用定期删除惰性删除策略结合起来&#xff0c;以及采用淘汰策略来兜底。 定期删除策略&#xff1a;Redis 启用一个定时器定时监视所有的 key&#xff0c;判断key是否过期&#xff0c;过…...

【讲解下ECMAScript和JavaScript之间有何区别?】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…...

Linux基本指令查询硬件信息001

在Linux系统中查询硬件信息可以通过多种命令行工具完成&#xff0c;本章主要讲述如何查询Linux硬件信息。 操作系统&#xff1a; CentOS Stream 9 操作步骤&#xff1a; 指令uname -a : 显示内核版本、硬件名称、操作系统等基本信息。 [rootlocalhost ~]# uname -a Linux …...

Spring Boot(七十四):集成Guava 库实现布隆过滤器(Bloom Filter)

之前在redis(17):什么是布隆过滤器?如何实现布隆过滤器?中介绍了布隆过滤器,以及原理,布隆过滤器有很多实现和优化,由 Google 开发著名的 Guava 库就提供了布隆过滤器(Bloom Filter)的实现。在基于 Maven 的 Java 项目中要使用 Guava 提供的布隆过滤器,只需要引入以…...

二叉查找树详解

目录 二叉查找树的定义 二叉查找树的基本操作 查找 插入 建立 删除 二叉树查找树的性质 二叉查找树的定义 二叉查找树是一种特殊的二叉树&#xff0c;又称为排序二叉树、二叉搜索树、二叉排序树。 二叉树的递归定义如下&#xff1a; &#xff08;1&#xff09;要么二…...

3072. 将元素分配到两个数组中 II

题目 给你一个下标从 1 开始、长度为 n 的整数数组 nums 。 现定义函数 greaterCount &#xff0c;使得 greaterCount(arr, val) 返回数组 arr 中 严格大于 val 的元素数量。 你需要使用 n 次操作&#xff0c;将 nums 的所有元素分配到两个数组 arr1 和 arr2 中。在第一次操…...

城市之旅:使用 LLM 和 Elasticsearch 简化地理空间搜索(二)

我们在之前的文章 “城市之旅&#xff1a;使用 LLM 和 Elasticsearch 简化地理空间搜索&#xff08;一&#xff09;”&#xff0c;在今天的练习中&#xff0c;我将使用本地部署来做那里面的 Jupyter notebook。 安装 Elasticsearch 及 Kibana 如果你还没有安装好自己的 Elasti…...

【知识点】 C++ 构造函数 参数类型为右值引用的模板函数

C 构造函数是一种特殊的成员函数&#xff0c;用于初始化类对象。C 中的构造函数主要分为以下几种类型&#xff1a; 默认构造函数&#xff08;Default Constructor&#xff09;参数化构造函数&#xff08;Parameterized Constructor&#xff09;拷贝构造函数&#xff08;Copy C…...

华为云服务器-云容器引擎 CCE环境构建及项目部署

1、切换地区 2、搜索云容器引擎 CCE 3、购买集群 4、创建容器节点 通过漫长的等待(五分钟左右)&#xff0c;由创建中变为运行中&#xff0c;则表明容器已经搭建成功 购买成功后&#xff0c;返回容器控制台界面 5、节点容器管理 6、创建redis工作负载 7、创建mysql工作负载 8、…...

Linux shell编程学习笔记57:lshw命令 获取cpu设备信息

0 前言 在Linux中&#xff0c;获取cpu信息的命令很多&#xff0c;除了我们已经研究的 cat /proc/cpuinfo、lscpu、nproc、hwinfo --cpu 命令&#xff0c;还有 lshw命令。 1 lshw命令的功能 lshw命令源自英文list hardware&#xff0c;即列出系统的硬件信息&#xff0c;这些硬…...

从Imagination董事会风波看半导体IP行业的地缘政治与商业模式挑战

1. 从一场董事会风波看全球半导体IP格局的变迁最近几年&#xff0c;半导体行业的朋友们茶余饭后除了聊制程、聊架构&#xff0c;也少不了聊各种资本并购的“大戏”。其中&#xff0c;英国GPU IP巨头Imagination Technologies的董事会风波&#xff0c;堪称一部集商业、资本与地缘…...

宝塔面板磁盘爆满排查与清理全记录

前言前几天登录宝塔面板&#xff0c;发现磁盘空间告急&#xff08;日志文件都清理了&#xff0c;怎么磁盘占用率还这么高&#xff09;&#xff1a;81.52G / 98.3G&#xff0c;剩余不足 17%。虽然服务器负载不高&#xff0c;但这个磁盘占用率让人隐隐不安——如果不及时处理&…...

3款实用论文降重神器,帮你轻松解决重复率难题

对于正在撰写毕业论文或者期刊论文的创作者来说&#xff0c;重复率不达标绝对是最头疼的问题之一。自己手动改了三五遍&#xff0c;重复率还是卡在要求线以上&#xff0c;不仅耽误时间还影响心态&#xff0c;这时候一款好用的降重工具就能帮你省下不少精力。今天我们就以第三方…...

别再死记硬背了!用一块74283芯片搞定所有BCD码转换(附实战练习题)

用74283芯片玩转BCD码转换&#xff1a;从原理到实战的终极指南 在数字电路设计与计算机组成原理的学习中&#xff0c;BCD码转换一直是让许多学生头疼的"拦路虎"。传统的死记硬背方法不仅效率低下&#xff0c;更无法应对考试中千变万化的题型。本文将彻底改变这一现状…...

用Python+CCA算法搞定SSVEP脑电信号识别:从理论到代码实战(附GitHub源码)

PythonCCA算法实现SSVEP脑电信号识别实战指南 在脑机接口研究领域&#xff0c;稳态视觉诱发电位&#xff08;SSVEP&#xff09;因其高信噪比和稳定特性成为热门研究方向。典型相关分析&#xff08;CCA&#xff09;作为SSVEP信号处理的经典算法&#xff0c;以其数学优雅和实现简…...

保姆级教程:在Windows 10/11上从源码编译Groops(含Qt环境变量避坑指南)

从零构建Groops编译环境&#xff1a;Windows系统下的完整避坑指南 当你在GNSS数据处理领域深耕时&#xff0c;一款强大的开源工具能让你事半功倍。Groops作为重力场恢复和精密定轨的瑞士军刀&#xff0c;其功能强大但编译过程却可能让新手望而却步。本文将带你一步步穿越编译迷…...

怎样高效管理微信社交网络:5个微信工具箱实用技巧完整指南

怎样高效管理微信社交网络&#xff1a;5个微信工具箱实用技巧完整指南 【免费下载链接】wechat-toolbox WeChat toolbox&#xff08;微信工具箱&#xff09; 项目地址: https://gitcode.com/gh_mirrors/we/wechat-toolbox 微信工具箱&#xff08;wechat-toolbox&#xf…...

Intel Wi-Fi 6 AX201网卡‘代码10’通病?华硕/戴尔/联想多品牌用户自救指南

Intel Wi-Fi 6 AX201网卡‘代码10’故障全解析与跨品牌解决方案 当你的笔记本突然无法连接Wi-Fi&#xff0c;设备管理器中那个带着黄色感叹号的Intel Wi-Fi 6 AX201网卡图标格外刺眼&#xff0c;显示着"该设备无法启动&#xff08;代码10&#xff09;"的提示——这不…...

NAND闪存市场演进:从消费电子到AI时代的技术博弈与产业洞察

1. 从一篇旧闻说起&#xff1a;NAND闪存市场的“过山车”与底层逻辑最近在整理资料时&#xff0c;翻到一篇2012年的行业旧闻&#xff0c;标题是《平板电脑需求推动NAND闪存增长》。文章的核心观点很明确&#xff1a;以智能手机、平板电脑&#xff08;当时还是iPad和安卓平板争锋…...

大语言模型越狱攻防全景:从对抗攻击到安全防御实践

1. 项目概述与核心价值如果你正在研究或部署大语言模型&#xff0c;那么“越狱”这个词你一定不陌生。它指的是通过各种技术手段&#xff0c;诱导或迫使一个经过安全对齐的模型&#xff0c;输出其原本被禁止生成的内容&#xff0c;比如有害信息、隐私数据或违反其使用政策的回答…...