leetcode41 缺失的第一个正数

一、问题描述

二、解题思路

由于本题要求时间复杂度为O(n),空间复杂度为常数级,所以不能使用枚举和哈希表来解决,智能就地解决,可以用向量nums来模拟哈希表(原地哈希),解题思路如下:

(1)首先,遍历向量nums,如果numsi>0且未在正确的位置上,就将其换到正确的位置上,注意不能越界,完成遍历,将所有正整数n放置到索引位置n-1;

(2)然后,遍历操作完后的nums向量,如果在遍历过程中发现numsi!=i+1,就返回i+1,这个数字即为缺失的数字;

若遍历完成仍未发现,就返回n+1,即为缺失的最小正数。

注意:交换到正确位置要用while,因为要保证换过来的数字也要换到正确的位置。

三、代码实现

cpp 复制代码
class Solution {
public:
    int firstMissingPositive(vector<int>& nums) {
        //将数字i放到i-1的位置上(i>0),然后再进行遍历寻找缺失的数字
        int n=nums.size();
        //将数字i放到i-1位置
        for(int i=0;i!=nums.size();i++){
            //注意:使用while,保证交换过来的数也能被放到正确的位置
            while((nums[i]!=i+1)&&(nums[i]>0)&&(nums[i]<=n))
                swap(nums[i],nums[nums[i]-1]);
        }
        //遍历寻找缺失的数字
        for(int i=0;i!=nums.size();i++)
            if(nums[i]!=i+1) return i+1;
        return n+1;
    }
};
相关推荐
C^h4 小时前
c++ string
开发语言·c++
raindayinrain4 小时前
c++高性能--原子操作,无锁编程,操作顺序
开发语言·c++·性能优化
学逆向的4 小时前
C++ 合并命名空间
开发语言·c++·网络安全
Zhao-Jichao5 小时前
VS2026 打包 C++ 程序生成 EXE,借助 Installer Project 扩展工具
开发语言·c++
小徐不徐说6 小时前
C++ 接口与插件设计:从工厂注册到 Qt 动态插件
数据库·c++·qt·系统架构·程序设计
大都督会赢的6 小时前
C++第一节课
开发语言·c++
UIU1146 小时前
P1233 [ICPC 2001 Taejon R] 木棍加工
数据结构·c++·算法·动态规划
论文复现现场6 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
ZhengEnCi6 小时前
用 AI 写代码为什么拼到最后还是拼人:算力瓶颈与领域专家提示词的本质差异
算法·架构
TMedical7 小时前
MedPlanning 截骨模拟矫形功能
c++·图像处理·人工智能·qt·健康医疗