当前位置: 首页 > news >正文

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 = &num;} else if (*a > num && (b == nullptr || num > *b)) {c = b;b = &num;} else if (b != nullptr && *b > num && (c == nullptr || num > *c)) {c = &num;}}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」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…...

FPGA时序分析与约束(6)——综合的基础知识

在使用时序约束的设计过程中&#xff0c;综合&#xff08;synthesis&#xff09;是第一步。 一、综合的解释 在电子设计中&#xff0c;综合是指完成特定功能的门级网表的实现。除了特定功能&#xff0c;综合的过程可能还要满足某种其他要求&#xff0c;如功率、操作频率等。 有…...

Python实现一个简单的http服务,Url传参输出html页面

摘要 要实现一个可以接收参数的HTTP服务器&#xff0c;您可以使用Python标准库中的http.server模块。该模块提供了一个简单的HTTP服务器&#xff0c;可以用于开发和测试Web应用程序。 下面是一个示例代码&#xff0c;它实现了一个可以接收参数的HTTP服务器&#xff1a; 代码…...

力矩传感器模拟量与ADC采集输出数字量之间的关系

力矩传感器在测量力矩时&#xff0c;会输出一个模拟信号&#xff0c;通常是一个电压或电流信号。这个模拟信号的大小会根据所测量的力矩变化而变化。 ADC&#xff08;模数转换器&#xff09;是一种电子设备&#xff0c;可以将模拟信号转换为数字信号。ADC通过采样和量化模拟信…...

Confluence 解决PDF导出乱码问题

1.原因 PDF导出乱码是因为由于服务器缺少必要字体 2.解决办法 下载字体文件将字体文件重命名为simhei.ttf Confluence→管理→PDF导出语言支持&#xff0c;导入字体即可...

visual studio Qt 开发环境中手动添加 Q_OBJECT 导致编译时出错的问题

问题简述 创建项目的时候&#xff0c;已经添加了类文件&#xff0c;前期认为不需要信号槽&#xff0c;就没有添加宏Q_OBJECT,后面项目需要&#xff0c;又加入了宏Q_OBJECT&#xff0c;但是发现只是添加了一个宏Q_OBJECT&#xff0c;除此之外没有改动其它的代码&#xff0c;原本…...

Addressable使用指南

1、基础用法就不再赘述了&#xff0c;重要的属性配置&#xff1a; Disable Catalog Update on Startup&#xff1a;禁用时在初始化Addressables的时候自动更新远程的catalog&#xff08;启用后可以通过代码 Addressables.CheckForCatalogUpdates()更新&#xff09; Use…...

【力扣每日一题】2023.10.22 做菜顺序

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 给我们一个数组表示每个菜的满意度&#xff0c;我们可以指定做哪些菜以及做的顺序&#xff0c;需要我们凑到一个系数的最大值&#xff0c…...

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结构组成的&#xff1a; 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浏览器插件。

本篇文章主要讲解&#xff0c;注册chrome开发者账号&#xff0c;及发布chrome浏览器插件的流程。包含插件的打包和上传。 日期&#xff1a;2023年10月22日 作者&#xff1a;任聪聪 一、前提准备&#xff1a;注册chrome开发者账号 说明&#xff1a;注册需要5美元&#xff0c;一…...

基于孔雀优化的BP神经网络(分类应用) - 附代码

基于孔雀优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于孔雀优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.孔雀优化BP神经网络3.1 BP神经网络参数设置3.2 孔雀算法应用 4.测试结果&#xff1a;5.M…...

支付宝小程序介入人脸识别(金融级--前端部分)

在这里只做前端部分说明: 详情参考文档:如何通过集成支付宝小程序唤起实人认证服务_实人认证-阿里云帮助中心 操作步骤 调用 API 发起认证。 发起认证服务。 调用 startBizService 接口请求认证。 function startAPVerify(options, callback) {my.call(startBizService, {n…...

设置Oracle环境变量

打开系统变量 1.ORACLE_HOME&#xff1a; 新建一个变量home&#xff0c;再在path中添加&#xff1a;%ORACLE_HOME%\BIN 变量名&#xff1a; ORACLE_HOME 变量值&#xff1a; D:\app\chenzhi\product\11.2.0\dbhome_2&#xff08;自己的存放地址&#xff09; 2.NLS_LANG&am…...

大模型之Chat Markup Language

背景 在笔者应用大模型的场景中&#xff0c;对话模型(即大模型-chat系列)通常具有比较重要的地位&#xff0c;我们通常基于与大模型进行对话来获取我们希望理解的知识。然而大模型对话是依据何种数据格式来进行训练的&#xff0c;他们的数据为什么这么来进行组织&#xff0c;本…...

分布式链路追踪系统Skywalking的部署和应用

一&#xff0c;背景 随着业务的扩张&#xff0c;系统变得越来越复杂&#xff0c;由前端、app、api、微服务、数据库、缓存、消息队列、关系数据库、列式数据库等构成了繁杂的分布式网络。 当出现一个调用失败的问题时&#xff0c;要定位异常在哪个服务&#xff0c;需要进入每一…...

canvas绘制动态视频并且在视频上加上自定义logo

实现的效果&#xff1a;可以在画布上播放动态视频&#xff0c;并且加上自定义的图片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协程中的一个常用协程函数&#xff0c;它的作用是切换协程的执行上下文&#xff08;线程或调度器&#xff09;。具体来说&#xff0c;withContext 的主要功能如下&#xff1a; 切换执行上下文&#xff1a;withContext 允许你从一个执行上…...

分布式Trace:横跨几十个分布式组件的慢请求要如何排查?

目录 前言 一、问题的出现&#xff1f; 二、一体化架构中的慢请求排查如何做 三、分布式 Trace原理 四、如何来做分布式 Trace 前言 在分布式服务架构下&#xff0c;一个 Web 请求从网关流入&#xff0c;有可能会调用多个服务对请求进行处理&#xff0c;拿到最终结果。这个…...

作为APP广告网站的wordpress一定只能放在公网服务器----很重要

如果放在个人服务器&#xff0c;会导致死循环&#xff1a;我觉得这个事情是导致了循环重定向&#xff0c;客户访问website,然后被定向到store,如果这里是静态网页就结束了&#xff0c;但是现在store的网址是website,然后回被再次转发到website&#xff0c;然后website会再次转发…...

层次分析法(AHP)翻车实录:我踩过的3个大坑和避坑指南

层次分析法实战避坑指南&#xff1a;从理论到落地的关键挑战 去年数学建模竞赛中&#xff0c;我们团队在决策分析环节选择了层次分析法&#xff08;AHP&#xff09;&#xff0c;结果却因为几个隐蔽的陷阱导致最终结果与实际情况严重偏离。这次经历让我深刻认识到——掌握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 稳定排序,以及它如何让多关键字排序更优雅、更可靠

排序不只是排大小&#xff1a;深入理解 Python 稳定排序&#xff0c;以及它如何让多关键字排序更优雅、更可靠 在很多人的印象里&#xff0c;排序是编程入门阶段最基础的内容之一&#xff1a;把数字从小到大排好&#xff0c;把字符串按字母顺序整理出来&#xff0c;似乎没有太多…...

工业相机选型避坑指南:从传感器尺寸到镜头焦距的5个关键参数

工业相机选型避坑指南&#xff1a;从传感器尺寸到镜头焦距的5个关键参数 在工业自动化领域&#xff0c;视觉系统的精度和稳定性往往决定了整个生产线的质量水平。作为系统集成商或自动化工程师&#xff0c;面对市场上琳琅满目的工业相机产品&#xff0c;如何避免"参数陷阱…...

从LSTM到LLM-to-Action:SITS2026发布游戏智能演进年表(2018–2026),标注3次范式跃迁时刻及对应算力/数据拐点)

第一章&#xff1a;SITS2026分享&#xff1a;AGI与游戏智能 2026奇点智能技术大会(https://ml-summit.org) AGI在游戏环境中的验证价值 通用人工智能&#xff08;AGI&#xff09;并非仅面向抽象推理任务&#xff0c;游戏世界正成为其核心验证场域。开放世界RPG、实时策略与多…...

别再死记硬背了!用Python快速搞定离散数学命题逻辑的真值表与范式

用Python自动化离散数学&#xff1a;真值表与范式的实战指南 离散数学中命题逻辑的真值表与范式计算&#xff0c;常常让计算机专业的学生陷入重复机械运算的泥潭。当命题变元超过3个时&#xff0c;手工计算不仅耗时耗力&#xff0c;还容易出错。其实&#xff0c;这正是编程大显…...

告别手动更新!用C#和阿里云SDK,为你的Windows电脑打造一个IPV6 DDNS自动更新服务

告别手动更新&#xff01;用C#和阿里云SDK为Windows打造IPv6 DDNS自动更新服务 在IPv4地址日益枯竭的今天&#xff0c;IPv6已成为连接互联网的新标准。然而&#xff0c;大多数家庭宽带分配的IPv6地址是动态变化的&#xff0c;这给远程访问带来了挑战。本文将带你从零构建一个基…...

如何打造高效专业的多媒体播放器:MPC-BE深度技术解析

如何打造高效专业的多媒体播放器&#xff1a;MPC-BE深度技术解析 【免费下载链接】MPC-BE MPC-BE – универсальный проигрыватель аудио и видеофайлов для операционной системы Windows. 项目地址: htt…...

别再只盯着5G了!车联网里那些不起眼但至关重要的通信技术:CAN总线、LoRa与RFID实战解析

车联网底层通信技术实战&#xff1a;CAN总线、LoRa与RFID的工程化落地指南 当行业热议5G车联网时&#xff0c;真正决定系统稳定性的往往是那些沉默的"基础设施级"通信协议。在重庆某智能网联汽车测试场&#xff0c;我们曾目睹一辆搭载最新5G模组的原型车因CAN总线仲裁…...