LeetCode 2454. 下一个更大元素 IV:双单调栈

【LetMeFly】2454.下一个更大元素 IV:双单调栈

力扣题目链接:https://leetcode.cn/problems/next-greater-element-iv/

给你一个下标从 0 开始的非负整数数组 nums 。对于 nums 中每一个整数,你必须找到对应元素的 第二大 整数。

如果 nums[j] 满足以下条件,那么我们称它为 nums[i] 的 第二大 整数:

  • j > i
  • nums[j] > nums[i]
  • 恰好存在 一个 k 满足 i < k < j 且 nums[k] > nums[i] 。

如果不存在 nums[j] ,那么第二大整数为 -1 。

  • 比方说,数组 [1, 2, 4, 3] 中,1 的第二大整数是 4 ,2 的第二大整数是 3 ,3 和 4 的第二大整数是 -1 。

请你返回一个整数数组 answer ,其中 answer[i] nums[i] 的第二大整数。

 

示例 1:

输入:nums = [2,4,0,9,6]
输出:[9,6,6,-1,-1]
解释:
下标为 0 处:2 的右边,4 是大于 2 的第一个整数,9 是第二个大于 2 的整数。
下标为 1 处:4 的右边,9 是大于 4 的第一个整数,6 是第二个大于 4 的整数。
下标为 2 处:0 的右边,9 是大于 0 的第一个整数,6 是第二个大于 0 的整数。
下标为 3 处:右边不存在大于 9 的整数,所以第二大整数为 -1 。
下标为 4 处:右边不存在大于 6 的整数,所以第二大整数为 -1 。
所以我们返回 [9,6,6,-1,-1] 。

示例 2:

输入:nums = [3,3]
输出:[-1,-1]
解释:
由于每个数右边都没有更大的数,所以我们返回 [-1,-1] 。

 

提示:

  • 1 <= nums.length <= 105
  • 0 <= nums[i] <= 109

方法一:双单调栈

思路

使用一个单调栈可以很方便地得出每个数的“第一个更大数”。但现在要求每个数的“第二个更大数”,怎么办呢?那就使用两个单调栈呗。

使用两个单调非递增栈st1和st2,首先将数存到st1中。如果st1中(栈顶)的数遇到了更大的数,就(不断)弹出(栈顶元素)并放入st2。

在st2中若栈顶元素遇到了更大的数a,那么a就是栈顶元素的“第二更大数”。

方法

遍历数组,先处理st2后处理st1,保证二者为单调(非递增)栈即可。

  • 时间复杂度 O ( l e n ( n u m s ) ) O(len(nums)) O(len(nums))
  • 空间复杂度 O ( l e n ( n u m s ) ) O(len(nums)) O(len(nums))

AC代码

C++
class Solution {
public:vector<int> secondGreaterElement(vector<int>& nums) {stack<int> st1, st2;vector<int> ans(nums.size(), -1);for (int i = 0; i < nums.size(); i++) {while (st2.size() && nums[st2.top()] < nums[i]) {  // 第二次遇到“更大数”ans[st2.top()] = nums[i];st2.pop();}stack<int> temp;  // temp的作用是保持st2的入栈顺序为大到小while (st1.size() && nums[st1.top()] < nums[i]) {  // 第一次遇到更大数temp.push(st1.top());st1.pop();}st1.push(i);while (temp.size()) {st2.push(temp.top());temp.pop();}}return ans;}
};
Python
# from typing import Listclass Solution:def secondGreaterElement(self, nums: List[int]) -> List[int]:ans = [-1] * len(nums)st1 = []st2 = []for i in range(len(nums)):while st2 and nums[st2[-1]] < nums[i]:ans[st2[-1]] = nums[i]st2.pop()temp = []while st1 and nums[st1[-1]] < nums[i]:temp.append(st1[-1])st1.pop()st1.append(i)temp.reverse()st2 += tempreturn ans

同步发文于CSDN,原创不易,转载经作者同意后请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/134958992

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

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

相关文章

什么是PHP的反射(Reflection)?

PHP的反射&#xff08;Reflection&#xff09;是一组用于在运行时获取和操作PHP代码结构信息的特性和类。反射API允许您分析和操作类、方法、属性、参数等元素&#xff0c;使您能够在运行时检查和修改PHP代码的结构。反射通常用于以下一些情况&#xff1a; 自动化工具&#xff…

k8s 环境中ipvs VS iptables

IPVS vs. iptables 在 Kubernetes 中的区别 特性IPVSiptables类型L4 负载均衡器L3/L4 包过滤层级传输层 (L4)网络层 (L3) 和传输层 (L4)用途服务负载均衡网络流量的包过滤和NAT网络层在第4层操作 (TCP/UDP)在第3层 (IP) 和第4层 (TCP/UDP) 操作负载均衡支持多种负载均衡算法负载…

Gerrit 提交报错missing Change-Id in message footer

直接执行提示的命令&#xff1a; gitdir$(git rev-parse --git-dir); scp -p -P 29418 liyjgerrit.ingageapp.com:hooks/commit-msg ${gitdir}/hooks/ 如果报错&#xff1a; subsystem request failed on channel 0 在.git/hooks目录下看有没有生成commit-msg文件&#xff…

测序名词解释

测序深度&#xff08;Sequencing Depth&#xff09;是指&#xff1a;测序得到的碱基总量&#xff08;bp&#xff09;与基因组&#xff08;转录组或测序目标区域大小&#xff09;的比值&#xff0c;是评价测序量的指标之一。 测序深度的计算公式为&#xff1a; 测序深度 &…

一点技术细节

匈牙利算法&#xff1a; 14-4: 匈牙利算法 Hungarian Algorithm_哔哩哔哩_bilibili 课件&#xff1a;https://github.com/wangshusen/AdvancedAlgorithms.git SWin transformer&#xff1a; Swin Transformer论文精读【论文精读】_哔哩哔哩_bilibili patch:灰色 窗口&…

数据结构之---- 回溯算法

数据结构之---- 回溯算法 什么是回溯算法&#xff1f; 回溯算法是一种通过穷举来解决问题的方法&#xff0c;它的核心思想是从一个初始状态出发&#xff0c;暴力搜索所有可能的解决方案&#xff0c;当遇到正确的解则将其记录&#xff0c;直到找到解或者尝试了所有可能的选择都…

基于BP神经网络的驾驶模式识别,基于BP神经网络的驾驶行为识别

目录 BP神经网络的原理 BP神经网络的定义 BP神经网络的基本结构 BP神经网络的神经元 BP神经网络的激活函数, BP神经网络的传递函数 遗传算法原理 遗传算法主要参数 遗传算法流程图 完整代码包含数据下载链接: 基于BP神经网络的驾驶模式识别,基于BP神经网络的驾驶行为识别(…

day01-报表技术POI

前言 报表[forms for reporting to the higher organizations]&#xff0c;就是向上级报告情况的表格。简单的说&#xff1a;报表就是用表格、图表等格式来动态显示数据&#xff0c;可以用公式表示为&#xff1a;“报表 多样的格式 动态的数据”。 1、开发环境搭建 功能说…

图扑物联 | WEB组态可视化软件

什么是组态&#xff1f; 组态的概念来自于20世纪70年代中期出现的第一代集散控制系统&#xff08;Distributed Control System&#xff09;&#xff0c;可理解为“配置”、“设置”等&#xff0c;是指通过人机开发界面&#xff0c;用类似“搭积木”的简单方式来搭建软件功能&a…

[RK-Linux] 移植Linux-5.10到RK3399(六)| 检查GMAC(RTL8211F)配置使能千兆以太网

ROC-RK3399-PC Pro 使用 RTL8211F PHY 芯片作为以太网收发器。 RTL8211F是一种高性能的千兆以太网物理层收发器(PHY),广泛用于台式机、笔记本电脑、网络交换机等设备中。主要特点: 采用低功耗28nm CMOS技术,功耗低。支持千兆速率(10/100/1000Mbps)。支持全双工和半双工…

stm32H库的内部FLASH读写操作与结构体数组数据写入与读取

stm32H库的内部FLASH读写操作与结构体数组数据写入与读取 1.软硬件准备2.关于STM32的Flash的一些说明3.实验结果 参考博主-STM32系列(HAL库)——内部FLASH读写实验 1.软硬件准备 软件&#xff1a;CubeMX、SSCOM&#xff08;串口调试助手&#xff09; 硬件&#xff1a;SMT32F…

动态通讯录(并不难都能拿下)

文章目录 &#x1f680;前言&#x1f680;通讯录实现动态通讯录的初期准备模块化框架搭建 &#x1f680;实现接口函数 &#x1f680;前言 铁子们好啊&#xff01;今天咱们来整一个有意思的玩意——通讯录&#xff0c;相信大家对通讯录并不陌生&#xff0c;那接下来就跟着阿辉把…

基于ssm小区疫情防控管理系统论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本小区疫情防控管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据…

微信小程序集成腾讯地图

微信小程序集成腾讯地图 微信小程序集成腾讯地图&#xff0c;实现用户附近停车位搜索显示。 腾讯开发者Key申请 官方地址&#xff1a;https://lbs.qq.com/ 下载工具JS 微信小程序JS代码 // pages/check-services.js const app getApp() // 引入SDK核心类 var QQMapWX …

Nginx配合Vue的history模式

加上一行代码就行&#xff1a; try_files $uri $uri/ /index.html;

PyQt6 QTreeWidget树控件

锋哥原创的PyQt6视频教程&#xff1a; 2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计46条视频&#xff0c;包括&#xff1a;2024版 PyQt6 Python桌面开发 视频教程(无废话版…

疯狂SQL转换系列- SQL for Tencent Cloud VectorDB

为了尽量保证使用者通过统一的SQL标准访问各类型数据库&#xff0c;我们这里开启了“疯狂SQL转换系列”。转换的语法效果不一定是最好的&#xff0c;更多是为用户提供一个统一的数据库交互体验。转换数据库目标的确认更多是内生的。基于我们对业务发展的需要。该向量库SQL转换的…

Easy Excel生成复杂下Excel模板(下拉框)给用户下载

引言 文件的下载是一个非常常见的功能&#xff0c;也有一些非常好的框架可以使用&#xff0c;这里我们就介绍一种比较常见的场景&#xff0c;下载Excel模版&#xff0c;导入功能通常会配有一个模版下载的功能&#xff0c;根据下载的模版&#xff0c;填充数据然后再上传。 需求…

TrustGeo代码理解(七)preprocess.py

代码链接:https://github.com/ICDM-UESTC/TrustGeo 一、导入各种模块和数据库 # Load data and IP clusteringimport math import random import pandas as pd import numpy as np import argparse from sklearn import preprocessing from lib.utils import MaxMinScaler …

设计模式——外观模式(结构型)

引言 外观模式是一种结构型设计模式&#xff0c; 能为程序库、 框架或其他复杂类提供一个简单的接口。 ​ 问题 假设你必须在代码中使用某个复杂的库或框架中的众多对象。 正常情况下&#xff0c; 你需要负责所有对象的初始化工作、 管理其依赖关系并按正确的顺序执行方法等。…