【每日一题】下一个更大元素 IV

文章目录

  • Tag
  • 题目来源
  • 题目解读
  • 解题思路
    • 方法一:单调栈+优先队列
  • 写在最后

Tag

【单调栈】【2023-12-12】


题目来源

2454. 下一个更大元素 IV


题目解读

在数组中找出当前元素右侧第二个比自己大的整数,如果不存在,那么第二个比自己大的整数为 -1。


解题思路

方法一:单调栈+优先队列

思路

在介绍方法一之前需要先了解如何使用「单调栈」来求解 496. 下一个更大元素 I。简单说一下思路:遍历数组,如果数组当前元素大于栈顶元素,那么栈顶元素就找到了下一个更大的元素。根据该思想,可以在 O ( n ) O(n) O(n) 时间内解决下一个更大元素问题。

本题中,依旧使用该思想先找到某个元素的「第一个更大元素」。然后,将已经找到「第一个更大元素」的元素存入优先队列 pq 中。

具体操作如下:

  • pq 非空且堆顶元素小于当前遍历的元素时,说明当前元素为堆顶元素的「第二大」的整数,我们取出堆顶元素,并更新结果数组。重复该操作直至 qqq 为空或者堆顶元素大于等于当前遍历元素;
  • st 非空且栈顶元素对应的值小于当前遍历元素,则说明找到了栈顶元素的下一个更大的数字,将栈顶元素出栈,并加入堆 pq 中。重复执行该操作直至 st 为空或者栈顶元素大于等于当前遍历元素;
  • 将当前元素的下标压入栈 st 中。

算法

class Solution {
public:vector<int> secondGreaterElement(vector<int>& nums) {int n = nums.size();vector<int> res(n, -1);stack<int> st;priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;for (int i = 0; i < n; ++i) {while (!pq.empty() && pq.top().first < nums[i]) {res[pq.top().second] = nums[i];pq.pop();}while (!st.empty() && nums[st.top()] < nums[i]) {pq.push({nums[st.top()], st.top()});st.pop();}st.push(i);}return res;}
};

复杂度分析

时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn) n n n 为数组 nums 的大小。每个元素最多出入一次优先队列。

空间复杂度: O ( n ) O(n) O(n)


写在最后

如果您发现文章有任何错误或者对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。

如果大家有更优的时间、空间复杂度的方法,欢迎评论区交流。

最后,感谢您的阅读,如果有所收获的话可以给我点一个 👍 哦。

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

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

相关文章

chronyc立即加载时间同步

不需要等待直接加载 chronyc makestep chronyc sources -v chronyd 服务正在使用的 NTP 源服务器的详细状态。这个命令会列出每个源服务器的 IP 地址&#xff0c;以及每个源服务器的状态和时间偏移量。通过这个命令&#xff0c;你可以看到你的系统是从哪些 NTP 服务器获取时间…

Linux操作系统学习(零)、计算机概论

计算机概论 指令集 CPU中含有多种指令集&#xff0c;指令集对于CPU运算具有指导和优化的硬程序&#xff0c;用来引导CPU进行加减运算和控制计算机操作系统的一系列指令的集合 常见的就有微指令集RISC和复杂指令集CISC RISC&#xff1a;包括ARM架构和PPC架构 CISC&#xff…

vscode报错cnpm : 无法加载文件 C:\Program Files\nodejs\cnpm.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅

报错 打开powershell 执行 Start-Process powershell -Verb runAs set-ExecutionPolicy RemoteSigned 选择 Y 完成

PPT插件-好用的插件-字距快速设置-大珩助手

字距快速设置 包含两端对齐、段首缩进、取消缩进、字间距、行间距、段后距 段首缩进 每次缩进两个字符&#xff0c;可对选中的文字、选中的多个文本对象两个层级操作 取消缩进 将缩进取消&#xff0c;可对选中的文字、选中的多个文本对象两个层级操作 字间距 预设了常用…

TCP对数据的拆分

应用程序的数据一般都比较大&#xff0c;因此TCP会按照网络包的大小对数据进行拆分。 当发送缓冲区中的数据超过MSS的长度&#xff0c;数据会被以MSS长度为单位进行拆分&#xff0c;拆分出来的数据块被放进单独的网路包中。 根据发送缓冲区中的数据拆分情况&#xff0c;当判断…

evo_res指令使用及各参数使用效果

目录 参数含义 效果演示 evo_res no_l.zip l.zip evo_res no_l.zip l.zip -v 输出相关指令 evo_res no_l.zip l.zip -p evo_res no_l.zip l.zip -p --plot_markers evo_res no_l.zip l.zip --save_plot ./plot.pdf evo_res no_l.zip l.zip --serialize_plot ./s…

Selenium IED-安装及简单使用

本文已收录于专栏 《自动化测试》 目录 背景介绍优势特点安装步骤录制脚本总结提升 背景介绍 Selenium 通过使用 WebDriver 支持市场上所有主流浏览器的自动化。 Webdriver 是一个 API 和协议&#xff0c;它定义了一个语言中立的接口&#xff0c;用于控制 web 浏览器的行为。 每…

Spring基于xml半注解开发

目录 Component的使用 依赖注解的使用 非自定义Bean的注解开发 Component的使用 基本Bean注解&#xff0c;主要是使用注解的方式替代原有的xml的<bean>标签及其标签属性的配置&#xff0c;使用Component注解替代<bean>标签中的id以及class属性&#xff0c;而对…

做数据分析为何要学统计学(5)——什么问题适合使用卡方检验?

卡方检验作为一种非常著名的非参数检验方法&#xff08;不受总体分布因素的限制&#xff09;&#xff0c;在工程试验、临床试验、社会调查等领域被广泛应用。但是也正是因为使用的便捷性&#xff0c;造成时常被误用。本文参阅相关的文献&#xff0c;对卡方检验的适用性进行粗浅…

【测试开发】Python+Django实现接口测试工具

PythonDjango接口自动化 引言&#xff1a; 最近被几个公司实习生整自闭了&#xff0c;没有基础&#xff0c;想学自动化又不知道怎么去学&#xff0c;没有方向没有头绪&#xff0c;说白了其实就是学习过程中没有成就感&#xff0c;所以学不下去。出于各种花里胡哨的原因&#xf…

【Spring】手写一个简易starter

需求&#xff1a; 自定义一个starter&#xff0c;里面包含一个TimeLog注解和一个TimeLogAspect切面类&#xff0c;用于统计接口耗时。要求在其它项目引入starter依赖后&#xff0c;启动springboot项目时能进行自动装配。 步骤&#xff1a; &#xff08;1&#xff09;引入pom依赖…

【数据安全】金融行业数据安全保障措施汇总

数字化的今天&#xff0c;数据的价值不可估量&#xff0c;尤其是金融行业&#xff0c;数据不仅代表着企业的核心资产&#xff0c;还涉及到客户的隐私和信任。因此对于金融行业而言&#xff0c;保障数据安全至关重要。下面我们就来一起讨论为什么金融行业要保障数据安全&#xf…