Problem: 41. 缺失的第一个正数
题目:给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。
请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。

文章目录

  • 整体思路
  • 完整代码
  • 时空复杂度
    • 时间复杂度:O(N log N)
    • 空间复杂度:O(log N)

整体思路

这段代码旨在解决一个经典的数组问题:缺失的第一个正数 (First Missing Positive)。问题要求在一个未排序的整数数组中,找到没有出现的最小的正整数。例如,在 [3, 4, -1, 1] 中,最小的缺失正数是 2

该算法采用了一种简单直观的 “排序后线性扫描” 的策略。其核心逻辑步骤如下:

  1. 排序

    • 算法的第一步是对整个输入数组 nums 进行升序排序。
    • 目的:排序是这个解法的关键前提。它将所有负数、零和重复的正数都组织起来,更重要的是,它使得我们可以按顺序查找 1, 2, 3, ...。一旦排好序,如果这些正整数存在,它们必然会以(可能不连续的)升序出现。
  2. 线性扫描与目标追踪

    • 算法使用一个变量 ans,初始化为 1。这个 ans 变量可以被看作是“我们正在寻找的目标正整数”。
    • 接着,通过一个 for 循环遍历排序后的数组。
    • 在循环中,将数组中的当前元素 nums[i] 与我们的目标 ans 进行比较。
      • 如果 nums[i] == ans:这意味着我们找到了当前的目标 1(或 2, 3, …)。因此,我们需要更新我们的目标为下一个正整数,即执行 ans++
      • 如果 nums[i] != ans:这可能是因为 nums[i] 是一个负数、零、或者是一个比 ans 更大的正数,也可能是重复的数字。在任何这些情况下,我们都还没有找到当前的目标 ans,所以我们保持 ans 不变,继续向后查找。
  3. 返回结果

    • 当遍历完整个数组后,ans 的值就是最小的、没有在数组中找到的那个正整数。例如,如果数组中有 12ans 会被更新到 3。如果在后续的遍历中没有找到 3,那么 ans 最终就会停在 3,这正是我们想要的结果。

总而言之,这是一个逻辑简单、易于理解但时间效率不是最优的解法,因为其性能瓶颈在于排序步骤。

完整代码

class Solution {/*** 在一个未排序的整数数组中,找到没有出现的最小的正整数。* @param nums 输入的整数数组* @return 缺失的最小正整数*/public int firstMissingPositive(int[] nums) {// ans: 我们的“目标”或“候选”的最小缺失正整数,从 1 开始寻找。int ans = 1;// 步骤 1: 对数组进行升序排序。// 这使得我们可以按顺序查找 1, 2, 3, ...Arrays.sort(nums);// 步骤 2: 线性扫描排序后的数组for (int i = 0; i < nums.length; i++) {// 如果在数组中找到了我们当前的目标 (ans),// 说明 ans 不是缺失的,我们需要寻找下一个正整数。if (nums[i] == ans) {// 更新目标为下一个正整数ans++;}}// 遍历结束后,ans 的值就是第一个没有在数组中匹配到的正整数。return ans;}
}

时空复杂度

时间复杂度:O(N log N)

  1. 排序Arrays.sort(nums) 是算法中时间开销最大的部分。在Java中,对基本类型数组的排序采用的是双轴快速排序(Dual-Pivot Quicksort),其平均时间复杂度为 O(N log N)
  2. 线性扫描for 循环遍历整个数组一次,执行 N 次迭代。循环体内部的操作(比较和可能的自增)都是 O(1) 的。因此,这部分的时间复杂度是 O(N)

综合分析
算法的总时间复杂度由排序和线性扫描两部分构成,即 O(N log N) + O(N)。在 Big O 表示法中,我们只保留最高阶项,因此最终的时间复杂度由排序决定,为 O(N log N)

空间复杂度:O(log N)

  1. 主要存储开销:该算法在原地修改数组(通过排序),并没有创建与输入规模 N 成比例的新的数据结构。
  2. 排序的额外空间
    • Java 的 Arrays.sort 实现(双轴快速排序)是一种原地排序算法,但它需要递归。递归调用会占用调用栈(call stack)的空间。
    • 对于一个性能良好的快速排序实现,递归栈的深度在平均情况下是 O(log N),在最坏情况下可能达到 O(N)。
  3. 其他变量ansi 等变量只占用常数级别的空间,即 O(1)。

综合分析
算法所需的额外辅助空间主要由排序算法的递归调用栈决定。因此,在平均情况下,其空间复杂度为 O(log N)。如果忽略排序算法内部的栈空间,可以认为是 O(1),但 O(log N) 是一个更精确的分析。

LeetCode 热题 100】41. 缺失的第一个正数——(解法二)原地哈希

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

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

相关文章

在运行 Laravel Sail 前,需安装 Docker Desktop 并完成基础配置/具体步骤

一、安装 Docker Desktop&#xff08;必备环境&#xff09; Windows 系统 &#xff08;windows安装包 有两个版本&#xff09; 架构版本查看 1. Win R‌ 输入 ‌cmd‌ 打开命令提示符&#xff1b; 2. ‌输入命令‌&#xff1a; bash echo %PROCESSOR_ARCHITECTURE% 3. ‌结果…

AI 应用于进攻性安全

一、引言 大语言模型&#xff08;LLM&#xff09;和 AI 智能体的出现推动进攻性安全变革&#xff0c;其在侦察、扫描、漏洞分析、利用、报告五个阶段展现出数据分析、代码生成、攻击场景规划等能力&#xff0c;能提升安全团队效率与扩展性&#xff0c;但存在 “幻觉” 等局限性…

微控制器中的EXTI0(External Interrupt 0)中断是什么?

微控制器中的EXTI0(External Interrupt 0)中断是什么? EXTI0(External Interrupt 0) 是微控制器(如STM32等ARM Cortex-M系列芯片)中的一个外部中断线,专门用于处理来自特定GPIO引脚的外部信号触发中断。以下是详细说明: 1. 基本概念 EXTI(External Interrupt/Event …

EasyGBS平台内置AI算法了,算法成为了视频平台的标配

今年五一的时候立了个flag&#xff08;《国标GB28181平台EasyGBS未来研发方向在哪&#xff1f;》&#xff09;&#xff0c;我想不能再局限在只是满足于传统视频平台的功能&#xff0c;传统的EasyGBS也就是接入几种视频协议&#xff0c;什么RTSP、ONVIF、RTMP、GB28181这些&…

C# 常量与变量

在 C# 中&#xff0c;常量和变量是存储数据的基本方式&#xff1a; // 常量&#xff1a;使用 const 关键字声明&#xff0c;必须在声明时初始化&#xff0c;且值不能改变 const double Pi 3.14159; const string Message "Hello, World!"; ​ // 变量&#xff1a;…

TensorRT-LLM:大模型推理加速的核心技术与实践优势

大型语言模型推理就像让一头300公斤的大熊猫玩平衡木——显存消耗和计算效率这对双胞胎问题随时可能让表演翻车。以主流的7B参数模型为例&#xff0c;FP16精度下仅模型权重就吃掉14GB显存&#xff0c;这还没算上推理过程中不断膨胀的KV Cache——当处理2048长度的对话时&#x…

免费棱光 PDF:免安装 加水印 去水印 批量格式转换

各位办公小能手们&#xff0c;今天给大家介绍一款超棒的PDF处理工具——棱光PDF&#xff01;它完全免费&#xff0c;专门解决咱对PDF文件的常见操作需求。绿色免安装&#xff0c;体积小得跟颗花生米似的&#xff0c;打开就能用。它有三大核心功能&#xff0c;分别是水印管理、格…

(二)复习(Error Pattern/Result Pattern/)

文章目录 项目地址一、Error Pattern1.1 定义Error类1. ErrorType 可发生的错误类型2. Error类3. ValidataionError1.2 给每个实体创建Error类1. CategoryError类2. TicketErrror类3. EventErrror类二、Result Pattern1.1 自定义返回Result1. 泛型类2. 泛型方法1.2 Api层的Resu…

20250705-day6

NATO&#xff1a;北大西洋公约组织 Software Crisis&#xff1a;软件危机 Paradigm&#xff1a;设计范型 Waterfall Model&#xff1a;瀑布模型 Prototype Model&#xff1a;原型模型&#xff08;又称快速模型&#xff09; Spiral Model&#xff1a;螺旋模型 Agile&#xff1a;…

视频播放中时钟的概念及音视频同步概念

author: hjjdebug date: 2025年 07月 05日 星期六 18:20:45 CST descrip: 视频播放中时钟的概念及音视频同步概念 文章目录 1.前言: 视频播放:1. 固定延时时间2. 根据frame的duration来延时.3. 根据frame的PTS 来播放3.1. 时钟是什么?3.2. 时钟的用途. 2.音视频同步: 1.前言: …

Python基础之字符串操作全解析

在 Python 中&#xff0c;字符串是最常用的数据类型之一&#xff0c;掌握字符串的各种操作对于日常编程至关重要。本文将详细介绍 Python 字符串的类型特性、编码转换、常用运算符及方法&#xff0c;帮助你全面掌握字符串处理技巧。 一、字符串的基本类型 Python 中的字符串属…

【爬虫】逆向爬虫初体验之爬取音乐

寻找数据 打开F12中的网络页面&#xff0c;播放音乐后&#xff0c;筛选媒体&#xff0c;会发现当前这首歌曲音频链接地址&#xff0c;打开后&#xff0c;点击“标头”就能能看到请求URL 截取“.mp3”前面的一部分进行搜索&#xff0c;搜索出来了很多数据包&#xff0c;但都是…

CppCon 2018 学习:Fancy Pointers for Fun and Profit

“Fancy Pointers for Fun and Profit” 这个标题听起来像是在讨论**“高级指针用法”**&#xff0c;尤其是在C里&#xff0c;如何利用智能指针、定制指针类型&#xff0c;或者其他高级指针技巧来写更安全、更高效、更优雅的代码。 可能的理解和内容方向&#xff1a; 1. 什么是…

思辨场域丨数字信号技术重塑农林牧渔:从“靠天吃饭”到“靠数吃饭”

凌晨三点&#xff0c;山东莱芜的养猪户老李被手机震动惊醒。屏幕显示&#xff1a;3号猪舍&#xff0c;母猪即将分娩。他轻点屏幕启动远程监控&#xff0c;翻身继续入睡——而在几年前&#xff0c;这样的夜晚他只能在猪圈里守着。 清晨的茶园里&#xff0c;兴业县的茶农王大姐掏…

文心大模型及百度大模型内容安全平台齐获信通院大模型安全认证

近日&#xff0c;文心大模型与百度大模型内容安全平台——红线大模型双双荣获中国信息通信研究院泰尔认证中心颁发的“大规模预训练模型&#xff08;文本生成功能&#xff09;安全认证证书”&#xff0c;且二者的认证级别皆“增强级”的最高级别。 大规模预训练模型&#xff08…

香港服务器查询缓存禁用-性能优化关键技术解析

在香港服务器运维过程中&#xff0c;查询缓存禁用是提升数据库性能的关键操作。本文将深入解析禁用查询缓存的原理、操作步骤、适用场景及注意事项&#xff0c;帮助管理员优化MySQL服务器配置&#xff0c;解决高并发环境下的性能瓶颈问题。香港服务器查询缓存禁用-性能优化关键…

深度学习图像分类数据集—七种动物识别分类

该数据集为图像分类数据集&#xff0c;适用于ResNet、VGG等卷积神经网络&#xff0c;SENet、CBAM等注意力机制相关算法&#xff0c;Vision Transformer等Transformer相关算法。 数据集信息介绍&#xff1a;七种动物识别分类&#xff1a;[Chinese_Merganser, panda, Sika_Deer, …

ubuntu22桌面版中文输入法 fcitx5

不要去 ubuntu software 下载 fcitx5 快捷键用不了 直接 sudo apt install fcitx5 \ fcitx5-chinese-addons \ fcitx5-frontend-gtk4 fcitx5-frontend-gtk3 fcitx5-frontend-gtk2 \ fcitx5-frontend-qt5不要在fcitx5里面设置快捷键&#xff0c;有些应用可能无法生效 在设置里全…

推客系统小程序终极指南:从0到1构建自动裂变增长引擎,实现业绩10倍增长!

&#x1f4cc; 前言&#xff1a;为什么传统营销越来越难做&#xff1f;在流量红利消失的今天&#xff0c;企业普遍面临三大增长困境&#xff1a;获客成本飙升&#xff1a;电商、教育等行业单客成本突破500元&#xff0c;ROI持续走低用户粘性差&#xff1a;90%的活动用户只参与一…

【数据结构】排序算法:归并与堆

归并排序&#xff1a;分治策略的经典实现 算法原理 归并排序采用分治法策略&#xff0c;包含三个关键步骤&#xff1a; 分解&#xff1a;递归地将数组分成两半 解决&#xff1a;对子数组进行排序 合并&#xff1a;将两个有序子数组合并为一个有序数组 C语言实现 #includ…