普通数组-----缺失的第一个正数
个人主页Milestone-里程碑❄️个人专栏: 力扣hot100 CLinuxGitMySQL心向往之行必能至题目描述给你一个未排序的整数数组nums请你找出其中没有出现的最小的正整数。进阶你能实现时间复杂度为O(n)并且只使用常数级别额外空间的解决方案吗示例 1输入nums [1,2,0]输出3示例 2输入nums [3,4,-1,1]输出2示例 3输入nums [7,8,9,11,12]输出1数据范围1 nums.length 5 * 10^5-2^31 nums[i] 2^31 - 1解题思路这道题是 LeetCode Hot100 中的困难级高频题核心难点在于O (n) 时间复杂度 O (1) 空间复杂度的限制常规的哈希表 / 排序方法都无法满足要求因此我们采用原地哈希的思路核心思想利用数组本身作为哈希表将数值为k的正整数放到下标为k-1的位置数字1→ 下标0数字2→ 下标1...数字n→ 下标n-1n为数组长度解题步骤原地归位遍历数组将每个有效范围内的正整数交换到正确的位置查找缺失值再次遍历数组第一个下标i对应的值不等于i1的位置i1就是缺失的最小正整数边界处理如果数组中1~n都完整存在返回n1。代码实现Ccpp运行class Solution { public: int firstMissingPositive(vectorint nums) { int n nums.size(); // 第一步将每个正整数交换到正确的位置 for (int i 0; i n; i) { // 循环交换当前数是有效正整数且不在正确位置时持续交换 while (nums[i] 1 nums[i] n nums[i] ! nums[nums[i] - 1]) { // 计算当前数应该存放的下标 int j nums[i] - 1; // 交换元素将nums[i]放到正确位置 swap(nums[i], nums[j]); } } // 第二步遍历查找第一个缺失的正整数 for (int i 0; i n; i) { if (nums[i] ! i 1) { return i 1; } } // 第三步1~n都存在返回n1 return n 1; } };代码逐行解析1. 变量定义cpp运行int n nums.size();定义数组长度n简化后续代码同时明确有效正整数的范围是[1, n]超过n的正整数不可能是答案。2. 原地归位循环cpp运行for (int i 0; i n; i) { while (nums[i] 1 nums[i] n nums[i] ! nums[nums[i] - 1]) { int j nums[i] - 1; swap(nums[i], nums[j]); } }外层for循环遍历数组每一个位置确保每个数都被归位内层while循环持续交换直到当前数归位 / 超出范围三个条件缺一不可1 nums[i] n只处理有效范围内的正整数负数、0、大于 n 的数直接忽略nums[i] ! nums[nums[i]-1]避免重复元素死循环比如两个 1 交换会无限循环swap(nums[i], nums[j])将当前数交换到它应该在的位置。3. 查找缺失值cpp运行for (int i 0; i n; i) { if (nums[i] ! i 1) { return i 1; } } return n 1;遍历归位后的数组若nums[i] ! i1说明i1是缺失的最小正整数若所有位置都正确说明1~n都存在返回n1。复杂度分析时间复杂度O(n)每个元素最多被交换1 次就能归位两层循环总操作次数是线性的。空间复杂度O(1)仅使用了常数个临时变量没有开辟额外的数组 / 哈希表完全满足题目进阶要求。测试用例验证用例[1,2,0]归位后[1,2,0]遍历发现下标 2 值≠3返回 3用例[3,4,-1,1]归位后[1,-1,3,4]遍历发现下标 1 值≠2返回 2用例[7,8,9,11,12]归位后无变化遍历发现下标 0 值≠1返回 1。总结这道题的核心是原地哈希思想通过利用数组自身存储映射关系突破了常数空间的限制是 LeetCode 高频考察的思维题。掌握这个思路后同类的「原地修改数组找缺失值」题目都可以用相同逻辑解决

相关新闻

AI应用架构师必看:虚拟教育系统中的计算机视觉架构

AI应用架构师必看:虚拟教育系统中的计算机视觉架构

AI应用架构师必看:虚拟教育系统中的计算机视觉架构 一、引入与连接:当虚拟教育遇到“视觉大脑” 凌晨三点,虚拟教育平台「智课空间」的架构师小李盯着屏幕皱起眉头——他设计的AI助教又误判了学生的“举手”动作:明明学生只是伸了…

2026/5/17 7:25:23 阅读更多 →
虚拟展厅AI训练数据从哪来?架构师设计高效数据标注平台实践

虚拟展厅AI训练数据从哪来?架构师设计高效数据标注平台实践

虚拟展厅AI的“数据燃料”指南:训练数据从哪来?如何搭建高效标注平台? 标题选项 虚拟展厅AI训练数据从哪来?架构师手把手教你搭建高效标注平台从数据到智能:虚拟展厅AI训练数据来源及标注平台设计实践虚拟展厅AI的数据…

2026/7/6 11:06:49 阅读更多 →
Seal Plus 2.2.0 | 开源视频下载器,支持1000+视频平台

Seal Plus 2.2.0 | 开源视频下载器,支持1000+视频平台

Seal Plus是一款专为Android设备打造的强大高级视频和音频下载器,基于JunkFood02的Seal开发而来。此增强版本具备专属高级UI主题,融合先进功能与最新的Material Design 3设计理念。它拥有独家渐变暗主题,为用户呈现带有活力渐变的优质玻璃形态…

2026/7/6 6:21:45 阅读更多 →

最新新闻

如何用Kotlin Multiplatform实现Android与iOS应用代码共享:Fruitties实战指南

如何用Kotlin Multiplatform实现Android与iOS应用代码共享:Fruitties实战指南

如何用Kotlin Multiplatform实现Android与iOS应用代码共享:Fruitties实战指南 【免费下载链接】kotlin-multiplatform-samples Samples showcasing the Kotlin Multiplatform Jetpack libraries 项目地址: https://gitcode.com/GitHub_Trending/ko/kotlin-multipl…

2026/7/6 19:12:49 阅读更多 →
EasyContext内存优化秘籍:DeepSpeed Zero3卸载策略详解

EasyContext内存优化秘籍:DeepSpeed Zero3卸载策略详解

EasyContext内存优化秘籍:DeepSpeed Zero3卸载策略详解 【免费下载链接】EasyContext Memory optimization and training recipes to extrapolate language models context length to 1 million tokens, with minimal hardware. 项目地址: https://gitcode.com/gh…

2026/7/6 19:12:49 阅读更多 →
UE4SS:解锁虚幻引擎游戏无限可能的终极修改工具指南

UE4SS:解锁虚幻引擎游戏无限可能的终极修改工具指南

UE4SS:解锁虚幻引擎游戏无限可能的终极修改工具指南 【免费下载链接】RE-UE4SS Injectable LUA scripting system, SDK generator, live property editor and other dumping utilities for UE4/5 games 项目地址: https://gitcode.com/gh_mirrors/re/RE-UE4SS …

2026/7/6 19:08:46 阅读更多 →
如何安装和配置EnergyBar:10分钟快速上手教程

如何安装和配置EnergyBar:10分钟快速上手教程

如何安装和配置EnergyBar:10分钟快速上手教程 【免费下载链接】EnergyBar Supercharge your Macs Touch Bar. 项目地址: https://gitcode.com/gh_mirrors/en/EnergyBar 想要快速上手EnergyBar,让你的Mac Touch Bar变得更强大吗?Energy…

2026/7/6 19:08:46 阅读更多 →
如何快速入门Encog:5个简单步骤构建你的第一个神经网络

如何快速入门Encog:5个简单步骤构建你的第一个神经网络

如何快速入门Encog:5个简单步骤构建你的第一个神经网络 【免费下载链接】encog-java-core 项目地址: https://gitcode.com/gh_mirrors/en/encog-java-core Encog是一个强大的Java机器学习框架,专为构建和训练神经网络而设计。无论你是机器学习新…

2026/7/6 19:08:46 阅读更多 →
Linkora开发指南:如何为这款KMP应用贡献代码和新功能

Linkora开发指南:如何为这款KMP应用贡献代码和新功能

Linkora开发指南:如何为这款KMP应用贡献代码和新功能 【免费下载链接】Linkora Local-first multiplatform link organizer with optional self-hosted sync. 项目地址: https://gitcode.com/gh_mirrors/li/Linkora Linkora是一款基于Kotlin Multiplatform&a…

2026/7/6 19:06:45 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南:告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况:下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/6 8:11:50 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/6 8:11:52 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/6 6:52:56 阅读更多 →

月新闻