【原地算法】41. 缺失的第一个正数

hot100_缺失的第一个正数 本文介绍了两种O(n)时间、O(1)空间解决"寻找缺失的最小正整数"问题的方法。第一种"负号标记法"通过清理干扰项后利用负号标记存在的数字,最后扫描未标记位置得到答案。第二种"原地置换法"将数字归位到对应下标,最后检查位置不匹配处。两种方法都满足题目要求,"负标记法"代码更稳健但破坏原数组符号,"置换法"更直观但需处理重复元素防死循环。关键都是利用数组索引本身作为哈希表来标记数字存在性。 阅读详情

问题:

给你一个未排序的整数数组,请你找出其中没有出现的最小的正整数。

例子:

在这里插入图片描述

思路

1. 我们将数组中所有小于等于 00 的数修改为 N+1N+1;

2.我们遍历数组中的每一个数 xx,它可能已经被打了标记,
因此原本对应的数为 |x|,其中 ∣∣ 为绝对值符号。如果 ∣x∣∈[1,N],
那么我们给数组中的第 |x| - 1 个位置的数添加一个负号。
注意如果它已经有负号,不需要重复添加;

3.在遍历完成之后,如果数组中的每一个数都是负数,那么答案是 N+1,
否则答案是第一个正数的位置加 11。

代码:

#include <vector>
#include <algorithm>
using namespace std;
class Solution {
private:
    int N;
public:
    int firstMissingPositive(vector<int>& nums) {
        this->N = nums.size();
        for (int i = 0; i < N; ++i) {
            if(nums[i] <= 0)
                nums[i] = N+1;
        }
        for (int i = 0; i < N; ++i) {
            int num = abs(nums[i]);
            if (num <= N) {
                nums[num - 1] = -abs(nums[num - 1]);
            }
        }
        for (int i = 0; i < N; ++i) {
            if(nums[i] > 0)
                return i+1; // 返回的是下标+1
        }
        return N+1;
    }
};
【算法竞赛/大厂面试】41. 缺失的第一个正数 技术解析 摘要: 题目要求在未排序的整数数组中找到缺失的最小正整数,约束条件为时间复杂度O(n)和常数级额外空间。核心思路是利用数组长度n的特性(缺失数范围[1,n+1]),通过原地哈希标记存在的正整数: 预处理非正数为n+1; 遍历数组,将有效数对应的索引位置标记为负数; 首个正数索引+1即为答案,若全为负数则返回n+1。算法通过三次线性遍历实现,满足时空复杂度要求,解决了排序或哈希表方案的局限性。示例代码和边界案例验证了算法的正确性。 阅读详情

相关推荐

FPGA新手避坑指南:手把手教你搞定RTL8211千兆网PHY的时序配置(附Verilog代码)

本文详细解析了FPGA与RTL8211千兆网PHY芯片的时序配置问题,重点介绍了TXDLY/RXDLY引脚设置、FPGA发送端和接收端的Verilog实现,以及调试与验证的完整流程。通过硬件电路设计和代码示例,帮助开发者解决网络连接不稳定、丢包等常见问题,提升千兆网通信的稳定性。

weixin_28732953的博客 539

leetcode:41. 缺失的第一个正数

题目解析 1

OceanStar的博客 884

东华大学oj系统 39 最大乘积

39 最大乘积 作者: Turbo时间限制: 1S章节: 深度优先搜索 问题描述 : 对于n个数,从中取出m个数,如何取使得这m个数的乘积最大呢? 输入说明 : 第一行一个数表示数据组数   每组输入数据共2行:   第1行给出总共的数字的个数n和要取的数的个数m,1<=n<=m<=15,   第2行依次给出这n个数,其中每个数字的范围满足:a[i]的绝对值小于等于4。 输出说明 : 每组数据输出1行,为最大的乘积。 输入范例 : 1 5 5 1 2 3 4 2 输出范例 : 48 注:难

weixin_50336369的博客 527

【LeetCode】41. 缺失的第一个正数

一、题目描述 给你一个未排序的整数数组,请你找出其中没有出现的最小的正整数。 示例 1: 输入: [1,2,0] 输出: 3 示例 2: 输入: [3,4,-1,1] 输出: 2 示例 3: 输入: [7,8,9,11,12] 输出: 1 提示: 你的算法的时间复杂度应为O(n),并且只能使用常数级别的额外空间。 二、 解题思路 & 代码 将数组视为哈希表 最早知道这个思路是在《剑指 Offe》这本书上看到的,感兴趣的朋友不妨做一下这道问题:剑指 Offer 03. 数组中重复的数字。下面简要

weixin_41888257的博客 598

硬全桥副边钳位管Vds电压凸台揭秘——寄生参数引发的导通异常

本文深入分析了硬全桥副边钳位管Vds电压凸台现象,揭示了寄生参数如何引发导通异常。通过波形分析和工程实践,详细解析了走线电感的蓄能效应和体二极管的接力作用,并提供了PCB布局优化、元件选型和驱动电路调整等解决方案,帮助工程师有效应对这一常见问题。

weixin_30825581的博客 428

Fluent 2.5D动网格重构实战:涡旋压缩机复杂运动模拟指南

本文详细解析了Fluent 2.5D动网格重构技术在涡旋压缩机复杂运动模拟中的应用。通过对比传统方法,2.5D重构显著提升了计算效率和稳定性,特别适用于柱体类几何的网格处理。文章提供了从基础配置到参数优化的实战指南,包括关键设置步骤、常见问题排查及性能优化策略,帮助工程师有效解决动网格重构中的负体积和网格畸变问题。

weixin_28455801的博客 549

[LeetCode]41. 缺失的第一个正数

题目 给你一个未排序的整数数组,请你找出其中没有出现的最小的正整数。 示例 1: 输入: [1,2,0] 输出: 3 示例 2: 输入: [3,4,-1,1] 输出: 2 示例 3: 输入: [7,8,9,11,12] 输出: 1 提示: 你的算法的时间复杂度应为O(n),并且只能使用常数级别的额外空间。 解题思路 因为我们要找的数在 [1, N + 1] 里,最后 N + 1 这个元素我们不用找,只有在前面的 N 个元素都找不到的情况下,我们才返回 N + 1。所以我们可以把原始的数组当做哈希表来使

zaker123的博客 254

Win11 24H2共享访问被禁?深入聊聊SMB签名和‘不安全的来宾登录’那点事

本文深入解析Win11 24H2共享访问故障,探讨SMB签名的安全机制与‘不安全的来宾登录’问题。提供从注册表修改到组策略配置的多层次解决方案,特别针对家庭网络和打印机共享场景给出实用建议,帮助用户在安全与便利之间找到平衡。

weixin_42556197的博客 563

41. 缺失的第一个正数【leetcode】

原题地址:https://leetcode-cn.com/problems/first-missing-positive/ 题目上有要求是算法时间复杂度为O(n),并且只能使用常数级别的空间。 核心思想就是利用原数组记录出现过的值。 1、遍历数组,把数组中≤0或者>len的数都变为1,并且判断数组中是否已经存在1,不存在1那答案就直接为1。这时候数组就全为正数了,可以用负数标志一个数是否出现...

gogslow的博客 180

在 SAP BTP ABAP 环境中测试多租户 SaaS 解决方案的完整实践指南

ABAP SaaS测试阶段关键实践 在SAP BTP ABAP环境中开发多租户SaaS解决方案时,测试阶段(TST)对确保产品质量尤为关键。测试阶段应包含两个主要维度: 业务功能验证: 通过软件组件管理确保测试环境与代码仓库同步 创建并验证业务角色分配,确保权限配置正确 测试Fiori Launchpad导航流程和跨应用跳转 验证inbound/outbound通信配置 自动化质量管控: 在开发环境(DEV)执行本地ATC检查和单元测试 通过ABAP Test Cockpit(ATC)进行代码质量检查 集成

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 296

cursor AI代码编辑器IDE对接deepseek模型api;字节ai编辑器trae

参考: https://www.cursor.com/ https://platform.deepseek.com/https://www.cursor.com/下载安装后,注册账号登录即可 再高级里选择设置 再模型这注册模型: 模型名称一定要填正确,url地址填好,最后填上秘钥验证

weixin_42357472的博客 1万+

Leetcode之41.缺失的第一个正数

题目 题目描述 给你一个未排序的整数数组 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 * 105 -231 <= nums[i] <= 231 - 1

二木成林 513

【蓝凌表单】JSP组件常用语法整理

【代码】【蓝凌表单】JSP组件常用语法整理。

烧硬盘 708

【算法】原地哈希法(LeetCode41.缺失的第一个正数)

给你一个未排序的整数数组 ,请你找出其中没有出现的最小的正整数。请你实现时间复杂度为 并且只使用常数级别额外空间的解决方案。时间复杂度要求 O( n ) 空间复杂度要求 O( 1 ) 如果没有这些要求,解决这题的方法有很多种,暴力哈希指针排序……难点在于: 时空复杂度如何控制?不能排序,不能建容器,只能原地操作数组本身。不能嵌套循环、通过原数组模拟出哈希的工作模式。将数组的值与下标对应起来Java 版本代码及详细注释 C++版本代码及详细注释

CodeCodeBond的博客 757

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

41.寻找缺失的第一个正数:原地哈希算法详解

原地哈希算法通过索引映射和元素交换,将时间复杂度优化至O(n),空间复杂度优化至O(1)。该方法不仅高效,还能帮助深入理解数组索引与数值之间的关系。掌握这一算法,可轻松应对类似的高频面试题。

weixin_44435110的博客 685

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

【算法入门】LeetCode 41. 缺失的第一个正数(First Missing Positive)详细解题指南|原地哈希详解(Java & JavaScript)|LeetCode 41. 缺失的

理解该题,关键在于巧用索引和原地数组操作,是空间优化的典范题型。此思路基础之上,也可延伸到更多空间复杂度为O(1),操作复杂的数据结构题。祝你在算法道路越走越宽,练习多多,技术突飞猛进!这个问题考察了数组的原地操作和索引映射的技巧。通过将每个数字放置到其对应的索引位置,我们可以在一次遍历中找到缺失的最小正整数。这种方法的时间复杂度为 O(n),并且只使用了常数级别的额外空间。缺失的第一个正数问题是一个经典的数组问题,通过原地哈希法可以在 O(n) 的时间复杂度和 O(1) 的空间复杂度下高效解决。

南北极之间 1335

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【算法】leetcode41. 缺失的第一个正数(原地哈希)

问题来源 41. 缺失的第一个正数 41. 缺失的第一个正数 给你一个未排序的整数数组,请你找出其中没有出现的最小的正整数。 示例 1: 输入: [1,2,0] 输出: 3 示例 2: 输入: [3,4,-1,1] 输出: 2 示例 3: 输入: [7,8,9,11,12] 输出: 1 提示: 你的算法的时间复杂度应为O(n),并且只能使用常数级别的额外空间。 大佬解析 将数组视为哈希表,哈希函数为:f(nums[i]) = nums[i] - 1 代码 class Solut

weixin_43868754的博客 251

算法学习——“原地哈希法” (LCR 120. 寻找文件副本,41. 缺失的第一个正数)

算法学习——“原地哈希法”,这个方法名是一名网友给起的,很形象。简单理解就是,在一个数组中,将数值为 a 的元素放到索引为 a 的位置上去,这是一种降低空间复杂度的方法,在一些有条件限制的场景中非常适用。下面给两个力扣的例子进行详解。

我有明珠一颗的博客 430

【Problem:41. 缺失的第一个正数】从哈希表到原地哈希优化

题目要求找出未排序整数数组中缺失的最小正整数,要求时间复杂度为O(n)且空间复杂度为O(1)。 解法一使用哈希表存储所有数字,然后从1开始遍历查找缺失的最小正整数。虽然时间复杂度为O(n),但空间复杂度为O(n),不符合要求。 解法二采用原地哈希,通过交换将数字i放置到下标i-1的位置。遍历数组后,再次检查第一个不符合nums[i]=i+1的位置即为答案。若全部符合,则返回n+1。该方法满足时间O(n)和空间O(1)的要求。 示例: [1,2,0] → 3 [3,4,-1,1] → 2 [7,8,9,11,

通过输出内容提升自己 1062

从零开始写算法——普通数组篇:缺失的第一个正数

leetcode hot100 普通数组篇一道困难题

m0_59624833的博客 671

【LeetCode 热题 100】41. 缺失的第一个正数——(解法二)原地哈希

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

最短的捷径就是绕远路,绕远路才是我的最短捷径。 877

LeetCode 41 缺失的第一个正数

LeetCode 41 缺失的第一个正数题目描述思路代码改进思路代码 题目描述 给定一个未排序的整数数组,找出其中没有出现的最小的正整数。 思路 刚开始看到这道题感觉很简单,直接排序,然后从前往后扫描跳过负数,然后开始扫描,找到第一个没有出现的正数即可。 运行速度很快,但是总感觉不是这么写的… 代码 class Solution { public: int firstMissingPosi...

weixin_37905795的博客 191

41. 缺失的第一个正数

缺失的第一个正数的范围为 [ 1, n + 1 ],数组中的元素可能小于等于 0 , 也可能大于 n , 所以要先将小于等于0 和 大于 n 的元素改为1,同时记录数组本身是否出现1。如果数组本身已经出现了1,那么改为1不会影响最终的答案,如果数组本身就没有出现1,答案就是1。将数组本身作为Hash数组,遍历每一个元素 j, 将数组中num对应位置的数 nums[ j - 1 ] 转为负数,即nums[ j - 1 ] = - nums[ j - 1 ], 表示 j 这个数存在。

m0_62811060的博客 393

【每日算法Day 75】字节跳动面试题:手撕困难题,看过我Day 71的人都会做了!...

题目链接LeetCode 41. 缺失的第一个正数[1]题目描述给定一个未排序的整数数组,找出其中没有出现的最小的正整数。示例1输入: [1,2,0] 输出: 3 示例2输入: [3,4...

算法码上来 265

【LeetCode Hot 100】 - 缺失的第一个正数完全题解

方法时间复杂度空间复杂度是否满足题目要求推荐度哈希表O(n)O(n)❌ 空间不满足⭐⭐排序O(n log n)O(log n)❌ 时间不满足⭐⭐原地哈希(交换法)O(n)O(1)✅ 完美满足⭐⭐⭐⭐⭐原地哈希(标记法)O(n)O(1)✅ 完美满足⭐⭐⭐⭐交换条件写错:必须是= nums[i],否则会无限交换忘记处理重复数字:重复数字会导致死循环索引越界:交换前必须检查nums[i]在[1, n]范围内使用 while 而非 if。

Mr_pyx的博客 449

LeetCode Hot100 之 41 缺失的第一个正数

如果要用O(N) O(N)的话就比较简单,罐存储后从小到大遍历就行了。代码略。如果要符合题目要求的O(N) O(1)的话,还是看了视频讲解,原来是把下标作为天然的哈希标签去做,每个i-1的位置应该放的是i,如果不是,就试图将现在的这个位置上的数字与该在这个位置上的数字交换(可能存在需要多次交换的情况,所以后续代码这一部分是用的while循环而不是一次if)。

2301_79962314的博客 98
上一篇: Clion debug不输出内容 | Clion debug输出乱码
下一篇: 【快排分区算法,大顶堆】215. 数组中的第K个最大元素
做最好
博客等级 码龄9年 25粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值