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;
    }
};
相关推荐
血色橄榄枝2 小时前
基于用户注册信息的关键词检测挑战赛「Datawhale AI 夏令营」
人工智能·算法·机器学习
Cx330❀2 小时前
【MySQL基础】一文吃透“表的约束”:从 Null/Default 到主外键的终极安全法则
linux·服务器·数据库·c++·mysql·安全
c238563 小时前
第二篇:《测试指挥官:可视化单题自测框架(含 assert 实操)》
java·数据库·c++·算法·安全性测试
辞旧 lekkk3 小时前
【Redis初阶】常见数据类型
开发语言·数据库·c++·redis·学习·缓存·bootstrap
六点_dn3 小时前
Linux学习笔记-printf命令
linux·运维·算法
遥感知识服务4 小时前
Sentinel-1 + DEM + FwDET + 随机森林:从快速水深初估到多因子误差修正
算法·随机森林·sentinel
来一碗刘肉面5 小时前
顺序表与链表的比较
数据结构·算法·链表
alphaTao5 小时前
LeetCode 每日一题 2026/7/13-2026/7/19
算法·leetcode
nnerddboy5 小时前
脑电信号处理实战 03 | 运动想象脑机接口入门:ERD/ERS、CSP 空间滤波与左右拳想象解码
算法·信号处理
持力行5 小时前
C++与Java变量声明、定义及内存分配的核心区别
java·开发语言·c++