LeetCode 414. Third Maximum Number【数组】简单
本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章中,我不仅会讲解多种解题思路及其优化,还会用多种编程语言实现题解,涉及到通用解法时更将归纳总结出相应的算法模板。
为了方便在PC上运行调试、分享代码文件,我还建立了相关的仓库。在这一仓库中,你不仅可以看到LeetCode原题链接、题解代码、题解文章链接、同类题目归纳、通用解法总结等,还可以看到原题出现频率和相关企业等重要信息。如果有其他优选题解,还可以一同分享给他人。
由于本系列文章的内容随时可能发生更新变动,欢迎关注和收藏征服LeetCode系列文章目录一文以作备忘。
给你一个非空数组,返回此数组中 第三大的数 。如果不存在,则返回数组中最大的数。
示例 1:
输入:[3, 2, 1]
输出:1
解释:第三大的数是 1 。
示例 2:
输入:[1, 2]
输出:2
解释:第三大的数不存在, 所以返回最大的数 2 。
示例 3:
输入:[2, 2, 3, 1]
输出:1
解释:注意,要求返回第三大的数,是指在所有不同数字中排第三大的数。
此例中存在两个值为 2 的数,它们都排第二。在所有不同数字中排第三大的数为 1 。
提示:
1 <= nums.length <= 10^4-2^31 <= nums[i] <= 2^31 - 1
进阶: 你能设计一个时间复杂度 O(n) 的解决方案吗?
解法 遍历
思路:先去重复,再排序的做法/用堆的方法都是 n log n n\log n nlogn 级别的,因此不考虑。下面是我第一次做的方法。先循环找出第一大(最大)的数,再找出第二大的数,再循环找出第三大的数, O ( 3 n ) O(3n) O(3n) 的复杂度。
class Solution {
public:int thirdMax(vector<int>& nums) {long firMax = LONG_MIN, secMax = LONG_MIN, thiMax = LONG_MIN;for (int i = 0; i < nums.size(); ++i) if (nums[i] > firMax) firMax = nums[i]; for (int i = 0; i < nums.size(); ++i) if (nums[i] > secMax && nums[i] < firMax) secMax = nums[i];for (int i = 0; i < nums.size(); ++i) if (nums[i] > thiMax && nums[i] < secMax) thiMax = nums[i]; if (thiMax == LONG_MIN) return firMax;return thiMax;}
};
然后其实,可以合成一个循环。像是冒泡或者是单调队列,用 a , b , c a, b,c a,b,c 分别表示最大值,次大值和第三大的数。
- 如果当前元素比 a a a 大,则说明其一定比 b b b 和 c c c 都大。 我们同时更新 b b b 和 c c c 的值。 具体来说就是将 b b b 更新到 c c c , a a a 更新到 b b b (可以形象地考虑成是把元素往后挤出去)。
- 否则我们继续判断是否比 b b b 大,如果比 b b b 大,那么肯定也比 c c c 大,我们同时需要更新 c c c 的值。
- 如果都不比 a a a 和 b b b 大,我们继续判断是否比 c c c 大,如果是,我们更新c的值。
我们初始化 a , b , c a,b,c a,b,c 为 负无穷(LONG_MIN)。 这样我们最后只要判断 c c c 是不是负无穷即可,如果是负无穷我们返回 a a a ,否则我们返回 c c c 。
class Solution {
public:int thirdMax(vector<int>& nums) { long a = LONG_MIN, b = LONG_MIN, c = LONG_MIN; for (int &num : nums) {if (num > a) {c = b; b = a; a = num;} else if (num > b && num < a) {c = b; b = num;} else if (num > c && num < b) {c = num;}}return (c == LONG_MIN) ? a : c;}
};
另一种不依赖元素范围的做法是,将 a a a 、 b b b 和 c c c 初始化为空指针或空对象,视作「无穷小」,并在比较大小前先判断是否为空指针或空对象。遍历结束后,若 c c c 为空,则说明第三大的数不存在,返回 a a a ,否则返回 c c c 。
class Solution {
public:int thirdMax(vector<int> &nums) {int *a = nullptr, *b = nullptr, *c = nullptr;for (int &num : nums) {if (a == nullptr || num > *a) {c = b;b = a;a = #} else if (*a > num && (b == nullptr || num > *b)) {c = b;b = #} else if (b != nullptr && *b > num && (c == nullptr || num > *c)) {c = #}}return c == nullptr ? *a : *c;}
};
复杂度分析:
- 时间复杂度: O ( n ) O(n) O(n) ,其中 n n n 是数组 nums \textit{nums} nums 的长度。
- 空间复杂度: O ( 1 ) O(1) O(1) 。
相关文章:
LeetCode 414. Third Maximum Number【数组】简单
本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章…...
FPGA时序分析与约束(6)——综合的基础知识
在使用时序约束的设计过程中,综合(synthesis)是第一步。 一、综合的解释 在电子设计中,综合是指完成特定功能的门级网表的实现。除了特定功能,综合的过程可能还要满足某种其他要求,如功率、操作频率等。 有…...
Python实现一个简单的http服务,Url传参输出html页面
摘要 要实现一个可以接收参数的HTTP服务器,您可以使用Python标准库中的http.server模块。该模块提供了一个简单的HTTP服务器,可以用于开发和测试Web应用程序。 下面是一个示例代码,它实现了一个可以接收参数的HTTP服务器: 代码…...
力矩传感器模拟量与ADC采集输出数字量之间的关系
力矩传感器在测量力矩时,会输出一个模拟信号,通常是一个电压或电流信号。这个模拟信号的大小会根据所测量的力矩变化而变化。 ADC(模数转换器)是一种电子设备,可以将模拟信号转换为数字信号。ADC通过采样和量化模拟信…...
Confluence 解决PDF导出乱码问题
1.原因 PDF导出乱码是因为由于服务器缺少必要字体 2.解决办法 下载字体文件将字体文件重命名为simhei.ttf Confluence→管理→PDF导出语言支持,导入字体即可...
visual studio Qt 开发环境中手动添加 Q_OBJECT 导致编译时出错的问题
问题简述 创建项目的时候,已经添加了类文件,前期认为不需要信号槽,就没有添加宏Q_OBJECT,后面项目需要,又加入了宏Q_OBJECT,但是发现只是添加了一个宏Q_OBJECT,除此之外没有改动其它的代码,原本…...
Addressable使用指南
1、基础用法就不再赘述了,重要的属性配置: Disable Catalog Update on Startup:禁用时在初始化Addressables的时候自动更新远程的catalog(启用后可以通过代码 Addressables.CheckForCatalogUpdates()更新) Use…...
【力扣每日一题】2023.10.22 做菜顺序
目录 题目: 示例: 分析: 代码: 题目: 示例: 分析: 给我们一个数组表示每个菜的满意度,我们可以指定做哪些菜以及做的顺序,需要我们凑到一个系数的最大值,…...
MySQL 排名函数 RANK, DENSE_RANK, ROW_NUMBER
文章目录 1 排名函数有哪些?2 SQL 代码实现2.1 RANK2.2 DENSE_RANK2.3 ROW_NUMBER 1 排名函数有哪些? RANK(): 并列跳跃排名, 并列即相同的值, 相同的值保留重复名次, 遇到下一个不同值时, 跳跃到总共的排名DENSE_RANK(): 并列连续排序, 并列即相同的值, 相同的值保留重复名…...
avi视频协议的理解
可以把avi文件理解为由无数个struct结构组成的: 1. struct avifile { RIFF, AVI, struct. movi, struct hdrl} 2. struct hdrl { LIST, hdal, struct avih, struct stream0,struct stream1,struct stream2}; 3. struct stream {LIST …...
教你注册chrome开发者账号,并发布chrome浏览器插件。
本篇文章主要讲解,注册chrome开发者账号,及发布chrome浏览器插件的流程。包含插件的打包和上传。 日期:2023年10月22日 作者:任聪聪 一、前提准备:注册chrome开发者账号 说明:注册需要5美元,一…...
基于孔雀优化的BP神经网络(分类应用) - 附代码
基于孔雀优化的BP神经网络(分类应用) - 附代码 文章目录 基于孔雀优化的BP神经网络(分类应用) - 附代码1.鸢尾花iris数据介绍2.数据集整理3.孔雀优化BP神经网络3.1 BP神经网络参数设置3.2 孔雀算法应用 4.测试结果:5.M…...
支付宝小程序介入人脸识别(金融级--前端部分)
在这里只做前端部分说明: 详情参考文档:如何通过集成支付宝小程序唤起实人认证服务_实人认证-阿里云帮助中心 操作步骤 调用 API 发起认证。 发起认证服务。 调用 startBizService 接口请求认证。 function startAPVerify(options, callback) {my.call(startBizService, {n…...
设置Oracle环境变量
打开系统变量 1.ORACLE_HOME: 新建一个变量home,再在path中添加:%ORACLE_HOME%\BIN 变量名: ORACLE_HOME 变量值: D:\app\chenzhi\product\11.2.0\dbhome_2(自己的存放地址) 2.NLS_LANG&am…...
大模型之Chat Markup Language
背景 在笔者应用大模型的场景中,对话模型(即大模型-chat系列)通常具有比较重要的地位,我们通常基于与大模型进行对话来获取我们希望理解的知识。然而大模型对话是依据何种数据格式来进行训练的,他们的数据为什么这么来进行组织,本…...
分布式链路追踪系统Skywalking的部署和应用
一,背景 随着业务的扩张,系统变得越来越复杂,由前端、app、api、微服务、数据库、缓存、消息队列、关系数据库、列式数据库等构成了繁杂的分布式网络。 当出现一个调用失败的问题时,要定位异常在哪个服务,需要进入每一…...
canvas绘制动态视频并且在视频上加上自定义logo
实现的效果:可以在画布上播放动态视频,并且加上自定义的图片logo放在视频的右下角 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthd…...
分类预测 | MATLAB实现基于BiGRU-AdaBoost双向门控循环单元结合AdaBoost多输入分类预测
分类预测 | MATLAB实现基于BiGRU-AdaBoost双向门控循环单元结合AdaBoost多输入分类预测 目录 分类预测 | MATLAB实现基于BiGRU-AdaBoost双向门控循环单元结合AdaBoost多输入分类预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.MATLAB实现基于BiGRU-AdaBoos…...
Kotlin 协程(线程)切换
常用协程切换函数 withContext 是Kotlin协程中的一个常用协程函数,它的作用是切换协程的执行上下文(线程或调度器)。具体来说,withContext 的主要功能如下: 切换执行上下文:withContext 允许你从一个执行上…...
分布式Trace:横跨几十个分布式组件的慢请求要如何排查?
目录 前言 一、问题的出现? 二、一体化架构中的慢请求排查如何做 三、分布式 Trace原理 四、如何来做分布式 Trace 前言 在分布式服务架构下,一个 Web 请求从网关流入,有可能会调用多个服务对请求进行处理,拿到最终结果。这个…...
作为APP广告网站的wordpress一定只能放在公网服务器----很重要
如果放在个人服务器,会导致死循环:我觉得这个事情是导致了循环重定向,客户访问website,然后被定向到store,如果这里是静态网页就结束了,但是现在store的网址是website,然后回被再次转发到website,然后website会再次转发…...
层次分析法(AHP)翻车实录:我踩过的3个大坑和避坑指南
层次分析法实战避坑指南:从理论到落地的关键挑战 去年数学建模竞赛中,我们团队在决策分析环节选择了层次分析法(AHP),结果却因为几个隐蔽的陷阱导致最终结果与实际情况严重偏离。这次经历让我深刻认识到——掌握AHP的基…...
Day03:Function Calling 核心
文章目录一、Function Calling 核心概念与定义1.1 技术本质与原理1.2 与传统 AI 推理的区别1.3 主要技术实现框架二、Function Calling 的核心价值与解决的问题2.1 解决知识截止问题2.2 解决实时数据获取需求2.3 解决外部动作执行问题2.4 安全性与可控性设计三、Function Calli…...
排序不只是排大小:深入理解 Python 稳定排序,以及它如何让多关键字排序更优雅、更可靠
排序不只是排大小:深入理解 Python 稳定排序,以及它如何让多关键字排序更优雅、更可靠 在很多人的印象里,排序是编程入门阶段最基础的内容之一:把数字从小到大排好,把字符串按字母顺序整理出来,似乎没有太多…...
工业相机选型避坑指南:从传感器尺寸到镜头焦距的5个关键参数
工业相机选型避坑指南:从传感器尺寸到镜头焦距的5个关键参数 在工业自动化领域,视觉系统的精度和稳定性往往决定了整个生产线的质量水平。作为系统集成商或自动化工程师,面对市场上琳琅满目的工业相机产品,如何避免"参数陷阱…...
从LSTM到LLM-to-Action:SITS2026发布游戏智能演进年表(2018–2026),标注3次范式跃迁时刻及对应算力/数据拐点)
第一章:SITS2026分享:AGI与游戏智能 2026奇点智能技术大会(https://ml-summit.org) AGI在游戏环境中的验证价值 通用人工智能(AGI)并非仅面向抽象推理任务,游戏世界正成为其核心验证场域。开放世界RPG、实时策略与多…...
别再死记硬背了!用Python快速搞定离散数学命题逻辑的真值表与范式
用Python自动化离散数学:真值表与范式的实战指南 离散数学中命题逻辑的真值表与范式计算,常常让计算机专业的学生陷入重复机械运算的泥潭。当命题变元超过3个时,手工计算不仅耗时耗力,还容易出错。其实,这正是编程大显…...
告别手动更新!用C#和阿里云SDK,为你的Windows电脑打造一个IPV6 DDNS自动更新服务
告别手动更新!用C#和阿里云SDK为Windows打造IPv6 DDNS自动更新服务 在IPv4地址日益枯竭的今天,IPv6已成为连接互联网的新标准。然而,大多数家庭宽带分配的IPv6地址是动态变化的,这给远程访问带来了挑战。本文将带你从零构建一个基…...
如何打造高效专业的多媒体播放器:MPC-BE深度技术解析
如何打造高效专业的多媒体播放器:MPC-BE深度技术解析 【免费下载链接】MPC-BE MPC-BE – универсальный проигрыватель аудио и видеофайлов для операционной системы Windows. 项目地址: htt…...
别再只盯着5G了!车联网里那些不起眼但至关重要的通信技术:CAN总线、LoRa与RFID实战解析
车联网底层通信技术实战:CAN总线、LoRa与RFID的工程化落地指南 当行业热议5G车联网时,真正决定系统稳定性的往往是那些沉默的"基础设施级"通信协议。在重庆某智能网联汽车测试场,我们曾目睹一辆搭载最新5G模组的原型车因CAN总线仲裁…...
