LeetCode 算法:缺失的第一个正数c++

原题链接🔗:缺失的第一个正数
难度:困难⭐️⭐️⭐️

题目

给你一个未排序的整数数组 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 没有出现。

提示
1 <= nums.length <= 105
-231 <= nums[i] <= 231 - 1

题解

置换数组法

  1. 题解

“缺失的第一个正数” 是一个常见的算法问题,通常可以通过以下步骤来解决:

  1. 问题理解:给定一个未排序的整数数组,其中可能包含负数、零和重复的正数。数组中应该包含从1到n的整数,但有一个正数缺失了。任务是找到并返回这个缺失的正数。

  2. 初始化:首先,我们需要一个方法来快速判断数组中是否存在一个特定的正整数。

  3. 使用数组索引:我们可以利用数组的索引来帮助我们找到缺失的正数。由于数组索引从0开始,我们可以将数组中的每个正整数移动到它应该在的位置上,即索引i应该包含值i+1

  4. 处理非正数:将所有非正数(包括0和负数)以及大于数组长度的正数放到数组的末尾或忽略它们,因为它们不影响找到缺失的正数。

  5. 交换元素:遍历数组,对于每个正整数,如果它不在正确的位置上,就将它与正确的位置上的数交换。重复这个过程,直到所有正整数都位于正确的位置上,或者遇到一个已经在正确位置上的数。

  6. 寻找缺失的数:在完成上述步骤后,遍历数组,第一个不在正确位置上的索引i加1就是缺失的正数。

  7. 特殊情况处理:如果数组中所有的1到n都在正确的位置上,那么缺失的数就是n+1

  8. 时间复杂度:这个方法的时间复杂度是O(n),因为每个元素最多被交换一次。

  9. 空间复杂度:空间复杂度是O(1),因为我们只使用了常数级别的额外空间。

通过这种方法,我们可以高效地找到缺失的第一个正数,而不需要对数组进行排序或使用额外的存储空间。这种方法利用了原数组的空间,通过交换元素来减少所需的时间。

  1. 复杂度:时间复杂度是O(n,空间复杂度是O(1)

  2. 过程

  • 定义Solution类及其公共成员函数firstMissingPositive。这个函数接收一个整数类型的vector作为参数。

  • 遍历数组nums,将所有非正数或大于数组大小的数设置为0。这是因为这些数值不会影响第一个缺失的正整数。

  • 通过一个循环,将数组中的每个元素映射到它应该在的索引位置。例如,如果数组中有数字1,它应该被放置在索引0的位置。这里使用abs函数来获取元素的绝对值,然后减去1得到索引。接着使用swap函数交换元素,直到元素被放置在正确的位置。

  • 再次遍历数组,寻找第一个其值不等于索引加1的元素。如果找到了这样的元素,那么缺失的正整数就是这个索引加1。

  • 如果数组中的每个元素都与其索引加1相匹配,那么缺失的正整数就是数组大小加1。

  • main函数中,定义了一个vector<int>类型的数组nums,并初始化了一些元素。然后创建了Solution类的实例,并调用firstMissingPositive函数来找出缺失的第一个正整数,最后输出结果。

  • 程序结束,返回0表示正常退出。

  1. c++ demo
#include <iostream>
#include <vector>
#include <cstdlib> // 用于abs函数
using namespace std;class Solution {
public:int firstMissingPositive(vector<int>& nums) {int n = nums.size();// 将数组中的非正数和大于n的数标记为0,因为它们不会影响第一个缺失的正数for (int i = 0; i < n; ++i) {if (nums[i] <= 0 || nums[i] > n) {nums[i] = 0;}}// 利用原数组空间,将1-n的数字映射到数组的索引上for (int i = 0; i < n; ++i) {int index = abs(nums[i]) - 1;while (index >= 0 && index < n && nums[index] != abs(nums[i])) {swap(nums[i], nums[index]);index = abs(nums[i]) - 1;}}// 遍历数组,找出第一个索引不匹配的元素,其索引+1即为缺失的正数for (int i = 0; i < n; ++i) {if (nums[i] != i + 1) {return i + 1;}}// 如果所有位置都匹配,那么缺失的正数是n+1return n + 1;}
};int main() {vector<int> nums = { 3, 4, -1, 1 };Solution solution;cout << "The first missing positive is: " << solution.firstMissingPositive(nums) << endl;return 0;
}
  • 输出结果:

The first missing positive is: 2
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/26022.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

域内攻击 ----> DCSync

其实严格意义上来说DCSync这个技术&#xff0c;并不是一种横向得技术&#xff0c;而是更偏向于权限维持吧&#xff01; 但是其实也是可以用来横向&#xff08;配合NTLM Realy&#xff09;&#xff0c;如果不牵强说得话&#xff01; 那么下面&#xff0c;我们就来看看这个DCSyn…

[Vue3:axios]:实现登录跳转页面展示列表(查看教师所承担课程的学生选课情况)

文章目录 一&#xff1a;前置操作项目结构&#xff1a; 二&#xff1a;登录页面主要流程说明运行截图前端代码Login.vue 三&#xff1a;列表页面交互逻辑&#xff1a;涉及页面Page02.vue &#xff08;登录成功跳转学生选课页面&#xff09;运行截图 一&#xff1a;前置操作 ht…

数据结构:插入排序和希尔排序

插入排序 逆序的情况下&#xff1a; 时间复杂度&#xff1a;O(N^2) 空间复杂度&#xff1a;O(1) 顺序的情况下&#xff1a; 时间复杂度&#xff1a;O(N) 空间复杂度…

将字符串str1复制为字符串str2

定义两个字符数组str1和str2&#xff0c;再设两个指针变量p1和p2&#xff0c;分别指向两个字符数组中的有关字符&#xff0c;通过改变指针变量的值使它们指向字符串中的不同的字符&#xff0c;以实现字符的复制。编写程序&#xff1a; 运行程序&#xff1a; 程序分析&#xff1…

【T3】畅捷通T3软件查询明细账等账簿,出现某些列串位置。

【问题描述】 查询畅捷通T3软件科目明细账的时候&#xff0c; 出现某些行的数据串位置&#xff0c; 摘要、金额、方向都没有在对应的列。 【解决方案】 根据跟踪发现&#xff0c;最终在客户档案上发现问题。 数据串位中对应的客户名称、简称中的对后面多了一个【tab】键的空格…

从数组和指针笔试题深度理解 sizeof 和 strlen

一、sizeof 和 strlen 的区别 a.sizeof sizeof 计算变量所占内存内存空间大小的&#xff0c;单位是字节&#xff0c;如果操作数是类型的话&#xff0c;计算的是使用类型创建的变量所占内存空间的大小。sizeof 只关注占用内存空间的大小&#xff0c;不在乎内存中存放什么数据。…

Mysql学习(八)——多表查询

文章目录 五、多表查询5.1 多表关系5.2 多表查询概述5.3 内连接5.4 外连接5.5 自连接5.6 联合查询5.7子查询5.8 总结 五、多表查询 5.1 多表关系 概述&#xff1a;项目开发中&#xff0c;在进行数据库表结构设计时&#xff0c;会根据业务需求及业务模块之间的关系&#xff0c;…

Deepin安装PostGresql

最近要把开发环境完全从Windows移到Deepin上&#xff0c;本次介绍在Deepin借助apt-get安装和配置数据库。同时可以用Dbever提供图形化管理工具。 安装PostGreSQL数据库和创建数据库 #安装postgresql zhanglianzhuzhanglianzhu-PC:/$ sudo apt-get install postgresql-16 正在…

STM32CubeIDE使用过程记录

最近在做一款机器人的开发&#xff0c;使用到了STM32CubeIDE&#xff0c;这里记录一些使用技巧方便后续查阅。 STM32CubeIDE使用过程记录 快捷键开启代码自动补全功能看门狗设置CRC设置IO口取反定时器设置 及 定时器中断外部中断GPIO配置STC15单片机GPIO模式配置片内闪存&#…

完美落地的自动化测试框架(pytest):智能生成?业务依赖?动态替换?报告构建?你来,这儿有!

前言 随着软件测试行业的快速发展&#xff0c;去测试化、全员测开化的趋势&#xff0c;技术测试已成为确保软件质量不可或缺的一环。 但对于许多没有代码基础或缺乏系统性自动化知识的测试人员来说&#xff0c;如何入手并实现高质量的自动化测试成为了一个挑战。 为此&#xff…

C语言 图形化界面方式连接MySQL【C/C++】【图形化界面组件分享】

博客主页&#xff1a;花果山~程序猿-CSDN博客 文章分栏&#xff1a;MySQL之旅_花果山~程序猿的博客-CSDN博客 关注我一起学习&#xff0c;一起进步&#xff0c;一起探索编程的无限可能吧&#xff01;让我们一起努力&#xff0c;一起成长&#xff01; 目录 一.配置开发环境 二…

基于Java-SpringBoot-VUE-MySQL的企业财务报销系统

基于Java-SpringBoot-VUE-MySQL的企业财务报销系统 登陆界面 联系作者 如需本项目源代码&#xff0c;可扫码或者VX:bob1638 联系作者。 主页-02 系统功能持续更新中。。。 介绍 本系统是采用现代信息技术手段&#xff0c;采用JAVA开发语言&#xff0c;VUE语言&#xff0c;HTML语…

python导入非当前目录(如:父目录)下的内容

在开发python项目时&#xff0c;通常会划分不同的目录&#xff0c;甚至不同层级的目录&#xff0c;这时如果直接导入不在当前目录下的内容时&#xff0c;会报如下的错误&#xff1a;ModuleNotFoundError: No module named miniai其实这里跟操作系统的环境变量很类似的&#xff…

WMS仓储管理系统高效驱动制造企业物料管理

在现代制造业的快速发展中&#xff0c;仓储管理作为供应链的核心环节&#xff0c;其效率直接影响到企业的生产力和市场竞争力。随着科技的进步&#xff0c;实施WMS仓储管理系统逐渐成为推动仓储管理向智能化转型的关键力量。本文将深入探讨WMS仓储管理系统如何以创新的方式驱动…

使用 C# 学习面向对象编程:第 1 部分

介绍 C# 完全基于面向对象编程 (OOP)。首先&#xff0c;类是一组相似的方法和变量。在大多数情况下&#xff0c;类包含变量、方法等的定义。当您创建此类的实例时&#xff0c;它被称为对象。在此对象上&#xff0c;您可以使用定义的方法和变量。 步骤1. 创建名为“LearnClass…

【深度学习】NLP,Transformer讲解,代码实战

文章目录 1. 前言2. Transformer结构训练过程1. 输入嵌入和位置编码2. 编码器层2.1 单头的注意力机制(便于理解)2.2 多头的注意力机制(Transformer真实使用的)2.3 残差连接和层归一化2.4 前馈神经网络&#xff08;FFN&#xff09;2.5 残差连接和层归一化2.6 总结 3. 解码器层 推…

Oracle数据库连接并访问Microsoft SQL Server数据库

Oracle数据库连接并访问Microsoft SQL Server数据库 说明&#xff1a;  1.实际开发中&#xff0c;Oracle数据库与SQLServer数据库之间可能需要相互进行访问&#xff0c;方便业务数据抽取&#xff0c;编写视图及表等操作。  2.SQLServer访问Oracle数据库配置相对较为简单&…

MySQL高性能(SQL性能分析)

MySQL性能系列 SQL性能分析 前言1.SQL执行评率2. 慢查询日志3. profile详情4. Explain执行计划4.1. Explain — id4.2. Explain — type4.3. Explain — table4.4. Explain — key 前言 本篇文章采用的MySQL版本是8代&#xff0c;同时自己使用的是Linux mysql8&#xff0c;本篇…

msfconsole利用Windows server2008cve-2019-0708漏洞入侵

一、环境搭建 Windows系列cve-2019-0708漏洞存在于Windows系统的Remote Desktop Services&#xff08;远程桌面服务&#xff09;&#xff08;端口3389&#xff09;中&#xff0c;未经身份验证的攻击者可以通过发送特殊构造的数据包触发漏洞&#xff0c;可能导致远程无需用户验…

数据结构与算法笔记:基础篇 - 红黑树(上):为什么工程中都用红黑树这种二叉树?

概述 上两篇文章&#xff0c;我们依次讲解了树、二叉树、二叉查找树。二叉查找树是最常用的一种二叉树&#xff0c;它支持快速插入、删除、查找操作&#xff0c;各个操作的时间复杂度跟树的高度成正比&#xff0c;理想情况下&#xff0c;时间复杂度是 O ( l o g n ) O(logn) …