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;
    }
};
相关推荐
fpcc8 小时前
c++编程实践—堆和栈越界调试
c++
yi0118 小时前
LeetCode 219:存在重复元素 II——哈希表记录“最近一次出现的位置”
数据结构·人工智能·笔记·python·算法·leetcode·哈希表
weiabc10 小时前
MSYS2 UCRT64 + g++ C++ 中文输出乱码 完整全过程
c++
灯澜忆梦11 小时前
【面向对象编程C++】| 基础语法
java·c++·算法
禾小西11 小时前
Redis 数据结构:快速的 Redis 有哪些慢操作?
数据结构·数据库·redis
小蒋观天下11 小时前
专项方案:大场景港口AI安防、多干扰环境下的算法调优与落地实操
人工智能·深度学习·算法·安全·机器学习·计算机视觉·ai大模型
Evand J11 小时前
【电机滤波例程5】渐消因子自适应扩展卡尔曼滤波(EKF),MATLAB。PMSM负载突变下的状态估计。附下载链接
算法·matlab
H.莓飛11 小时前
【数据结构】二叉树_OJ题
linux·开发语言·数据结构·算法
好想像大佬一样能够ak所有12 小时前
Leetcode35.搜索插入位置
数据结构·算法·leetcode
aqiu11111112 小时前
【C++算法打怪专栏】LeetCode 165. 比较版本号(双指针与字符串流法)
c++·算法·leetcode