leetcode41. 缺失的第一个正数,原地哈希表

news/2024/9/20 1:13:08 标签: 散列表, 数据结构, 算法, 面试, c++, leetcode

leetcode41__0">leetcode41. 缺失的第一个正数

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

请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。

示例 1:

输入:nums = [1,2,0]
输出:3
解释:范围 [1,2] 中的数字都在数组中。
示例 2:

输入:nums = [3,4,-1,1]
输出:2
解释:1 在数组中,但 2 没有。
示例 3:

输入:nums = [7,8,9,11,12]
输出:1
解释:最小的正数 1 没有出现。

在这里插入图片描述

目录

题目分析

这是一个关于数组处理的问题。题目要求实现一个函数firstMissingPositive,该函数接受一个整数数组nums,并返回数组中第一个缺失的正整数。

算法介绍

为了解决这个问题,我们可以使用一种特殊的标记方法。首先,我们将所有小于等于0的元素替换为n+1,其中n是数组的长度。然后,我们遍历数组,将每个元素的正负号反转,如果它是一个正数。通过这种方式,我们可以标记数组中出现的所有正整数。最后,我们再次遍历数组,找到第一个未标记的正整数,即为答案。

算法步骤

  1. 遍历数组nums,将所有小于等于0的元素替换为n+1
  2. 再次遍历数组nums,反转每个元素的正负号,如果它是一个正数。
  3. 第三次遍历数组nums,找到第一个未标记的正整数,即为答案。

算法流程

开始
初始化 n
遍历 nums 替换小于等于0的元素为 n+1
遍历 nums 反转每个元素的正负号 如果它是一个正数
遍历 nums 找到第一个未标记的正整数
返回找到的正整数
结束

算法代码

class Solution {
public:
    int firstMissingPositive(vector<int>& nums) {
        int n = nums.size();
        for (int& num: nums) {
            if (num <= 0) {
                num = 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;
            }
        }
        return n + 1;
    }
};

算法分析

  • 时间复杂度:O(n),其中n是数组nums的长度。我们只需要遍历数组三次。
  • 空间复杂度:O(1),因为除了输入数组外,我们只使用了常数个额外空间。
  • 易错点
    • 确保正确地将所有小于等于0的元素替换为n+1
    • 在反转正负号时,确保只对正数进行操作。

相似题目

题目链接
缺失的第一个正数LeetCode 41
缺失的数字LeetCode 268

请注意,以上表格仅为示例,实际链接可能需要根据具体平台和题目编号进行调整。


http://www.niftyadmin.cn/n/5666427.html

相关文章

keil调试变量值被篡改问题

今天遇到一个代码中变量值被篡改的问题&#xff0c;某个数组的第一个值运行一段时间之后变成了0&#xff0c;如图&#xff1a; 看现象基本可以断定是内存越界导致的&#xff0c;但是要如果定位是哪里内存越界呢? keil提供了两个工具 1、set access breakpoint at(设置访问断点…

面试官:什么是CAS?存在什么问题?

大家好&#xff0c;我是大明哥&#xff0c;一个专注「死磕 Java」系列创作的硬核程序员。 回答 CAS&#xff0c;Compare And Swap&#xff0c;即比较并交换&#xff0c;它一种无锁编程技术的核心机制。其工作方式分为两步&#xff1a; 比较&#xff1a;它首先会比较内存中的某…

卷积和转置卷积的输出尺寸计算

卷积和转置卷积的输出尺寸计算 卷积 h是输出的高&#xff0c;h是输入的高&#xff0c;k_h是卷积核的高 w类似stride1 h h - k_h padding*2 1通用公式 stride1就是上面的公式 h (h - k_w 2*padding stride)//stride 一些常见的卷积 高宽不变的卷积&#xff1a;kernel…

智能会计定义

管理会计的发展离不开与信息技术的融合。信息化是支持管理会计理念与方法落地&#xff0c;支撑管理会计功能发挥和价值实现的重要手段和推动力量。将信息技术应用到管理会计领域&#xff0c;可以有效突破传统管理会计在时间空间上的限制&#xff0c;深入挖掘企业各个流程的相关…

攻防世界--->crackme

做题笔记。 下载 查壳。 OK&#xff0c;压缩壳。 额&#xff0c;reverse肯定是需要掌握手动脱壳的&#xff0c;而不能一直依赖脱壳机。 手动脱壳。 可以用Ollydbg LoadPE ImportREC 实现 脱壳 dump 修补表 得到最终脱壳的.exe 不过&#xff0c;挺麻烦的(我反正 LoadPE Impo…

Zabbix 部署----安装Zabbix(业务主机)

目录 1、另外准备一台虚拟机(192.xx.xx.20) 设置主机名 关闭防火墙、selinux 准备zabbix-repo 安装zabbix-agent 配置主服务器地址 启动zabbix-agent&#xff1a;10050 1、另外准备一台虚拟机(192.xx.xx.20) 设置主机名 hostname web1 关闭防火墙、selinux syst…

钢铁焦化水泥超低排放标准最新规定

钢铁、焦化、水泥行业的超低排放标准最新规定&#xff0c;是随着环保政策的不断升级而逐步完善的。以下是朗观视觉小编&#xff0c;根据最新政策文件和相关资料整理的各行业的超低排放标准&#xff1a; 一、钢铁行业 钢铁行业的超低排放标准主要关注有组织排放控制指标&#x…

Github Wiki 超链接 转 码云Gitee Wiki 超链接

Github Wiki 超链接 转 码云Gitee Wiki 超链接 Github 是 &#xff1a;[[相对路径]] Gitee 是 &#xff1a;[链接文字](./相对路径) 查找&#xff1a;\[\[(.*?)\]\] 替换&#xff1a;[$1]\(./$1\) 或替换&#xff1a;**[$1]\(./$1\)** &#xff08;码云的超链接&#xff0c;很…