单调栈(LeetCode-下一个更大元素)

每日一题

今天刷到了一道用到单调栈来解决的题目,想到自己没有总结过单调栈的知识点,因此想总结一下。

介绍

什么是单调栈?

单调栈的定义其实很简单,所谓单调栈就是指一个单调递增或是单调递减的栈。

那单调栈有什么用呢?

单调栈通常用来在一串数字(例如数组)中,找到某个数字的左侧或是右侧最近的大于或小于这个数字的数。

那么是如何实现的呢?

如果想要在一个数组中找到一个数字右侧大于它本身的第一个数,就可以使用一个单调递增的栈来实现。

可以从后向前遍历该数组,,如果此时单调栈为空那么将该数字压入栈,如果栈中不为空且当前遍历到数大于栈顶的数字,那么就会将栈顶的数字弹出栈,如果栈中的数一直小那就一直弹出,因为我们要维护这个从上到下递增的栈。这样对于每一个数来说,当轮到这个数的时候,在判断栈顶数字并弹出后,如果弹出后栈为空,那就证明这个数字后没有它本身大的数字。如果栈中还有数字,那么栈顶的元素就是该数字右侧第一个比他大的数字。因为比他的数字不会被弹出,并且遍历从后向前,这个数字一定是右侧最近的。

这个情况说完后,其他的情况也是一样的。

例题

来看力扣496题——下一个最大元素。

题目要求

nums1 中数字 x 的 下一个更大元素 是指 x 在 nums2 中对应位置 右侧 的 第一个 比 x 大的元素。

给你两个 没有重复元素 的数组 nums1 和 nums2 ,下标从 0 开始计数,其中nums1 是 nums2 的子集。

对于每个 0 <= i < nums1.length ,找出满足 nums1[i] == nums2[j] 的下标 j ,并且在 nums2 确定 nums2[j] 的 下一个更大元素 。如果不存在下一个更大元素,那么本次查询的答案是 -1 。

返回一个长度为 nums1.length 的数组 ans 作为答案,满足 ans[i] 是如上所述的 下一个更大元素 。

示例 1:

输入:nums1 = [4,1,2], nums2 = [1,3,4,2].
输出:[-1,3,-1]
解释:nums1 中每个值的下一个更大元素如下所述:
- 4 ,用加粗斜体标识,nums2 = [1,3,4,2]。不存在下一个更大元素,所以答案是 -1 。
- 1 ,用加粗斜体标识,nums2 = [1,3,4,2]。下一个更大元素是 3 。
- 2 ,用加粗斜体标识,nums2 = [1,3,4,2]。不存在下一个更大元素,所以答案是 -1 。

示例 2:

输入:nums1 = [2,4], nums2 = [1,2,3,4].
输出:[3,-1]
解释:nums1 中每个值的下一个更大元素如下所述:
- 2 ,用加粗斜体标识,nums2 = [1,2,3,4]。下一个更大元素是 3 。
- 4 ,用加粗斜体标识,nums2 = [1,2,3,4]。不存在下一个更大元素,所以答案是 -1 。

题目解析

该题是要我们找到一个数组num2的子数组num1中的数在num2中右侧最近的一个大于它的数,如果不存在就返回-1,存在就保存这个数,最后将这些数放在数组中。这个一个典型的单调栈问题,我们可以通过我上面提到的方法找到num2数组中的每个数右侧第一个大于本身的数并将其存在一个map中,最后通过遍历num1数组在map中找到对应的数字并存入数组。

下面我们来图文解释一下示例1中的情况

首先遍历数组,第一个数字——2,目前栈是空的,得到-1.将2压入栈

下面是4,2小于4.因此将2弹出,此时栈空得到-1,压入4

下面轮到3,3小于4,因此没有弹出操作,得到4,将3也压入栈

最后轮到1,1也小于3,因此不会弹出,得到3,并将1压入栈。

至此遍历结束我们得到了全部的数据并将其存入map中

1—— 3

3—— 4

4—— -1

2—— -1

最后遍历num1数组,拿到结果[-1,3,-1]

代码实现

class Solution {public int[] nextGreaterElement(int[] nums1, int[] nums2) {Map<Integer,Integer> map = new HashMap<>();Deque<Integer> stack  = new ArrayDeque<Integer>();for(int i =nums2.length-1;i>=0;i--){int num = nums2[i];while(!stack.isEmpty()&&num>=stack.peek()){stack.pop();}if(stack.isEmpty()){map.put(num,-1);   }else{map.put(num,stack.peek());}stack.push(num);}int[] res = new int[nums1.length];for(int i=0;i<nums1.length;i++){res[i] = map.get(nums1[i]);}return res;}
}

结果

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

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

相关文章

在单交换机局域网中,不同网段的主机通信探秘

在理解局域网中不同网段主机之间的通信之前&#xff0c;我们首先要明白网络的基本组成和工作原理。局域网&#xff08;LAN&#xff09;是一个封闭的网络环境&#xff0c;通常由交换机&#xff08;Switch&#xff09;作为核心设备连接网络中的各个主机。当我们谈论不同网段的主机…

基于Socket简单的TCP网络程序

⭐小白苦学IT的博客主页 ⭐初学者必看&#xff1a;Linux操作系统入门 ⭐代码仓库&#xff1a;Linux代码仓库 ❤关注我一起讨论和学习Linux系统 TCP单例模式的多线程版本的英汉互译服务器 我们先来认识一下与udp服务器实现的不同的接口&#xff1a; TCP服务器端 socket()&…

阿里云8核32G云服务器租用优惠价格表,包括腾讯云和京东云

8核32G云服务器租用优惠价格表&#xff0c;云服务器吧yunfuwuqiba.com整理阿里云8核32G服务器、腾讯云8核32G和京东云8C32G云主机配置报价&#xff0c;腾讯云和京东云是轻量应用服务器&#xff0c;阿里云是云服务器ECS&#xff1a; 阿里云8核32G服务器 阿里云8核32G服务器价格…

通用爬虫的概念简述

一、&#x1f308;什么是通用爬虫 通用爬虫&#xff08;General Purpose Web Crawler或Scalable Web Crawler&#xff09;是一种网络爬虫&#xff0c;其设计目标是对整个互联网或尽可能广泛的网络空间进行数据抓取。通用爬虫主要用于搜索引擎构建其庞大的网页索引数据库&#…

《债务与国家的崛起》西方民主制度的金融起源 - 三余书屋 3ysw.net

债务与国家的崛起&#xff1a;西方民主制度的金融起源 你好&#xff0c;今天我们来聊聊由英国知名经济与金融历史学家詹姆斯麦克唐纳所著的《债务与国家的崛起》这本书。19世纪世界历史上发生了一次巨变&#xff0c;即“大分流”。当时西方通过工业革命实现了科技和经济的飞速…

【开源语音项目OpenVoice](一)——实操演示

目录 一、前菜 1、Python选择 2、pip源切换 3、ffmpeg配置问题 4、VSCode添加Jupyter扩展 二、配置虚拟环境 1、下载源码 方法一 直接下载源码压缩包 方法二 使用git 1&#xff09;git加入鼠标右键 2&#xff09;git clone源码 2、VSCode出场 1&#xff09;创建pyth…

Bayes-RF,基于贝叶斯Bayes优化算法优化随机森林RF分类预测(二分类及多分类皆可)-附代码

Bayesian Optimization&#xff08;贝叶斯优化&#xff09;是一种用于超参数调优的技术&#xff0c;对于类似随机森林&#xff08;Random Forest&#xff0c;简称RF&#xff09;的机器学习算法非常重要。随机森林是一种集成学习方法&#xff0c;它在训练过程中构建多个决策树&a…

How-Google-Tests-Software_Google软件测试之道_英文版pdf

我看How-Google-Tests-Software_Google软件测试之道_英文版pdf挺难找的 在这里分享一下 链接: https://pan.baidu.com/s/1bTafUY4CFcMVxrNrdBp7Zg 提取码: 5q4p 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦

【Python使用】嘿马头条完整开发md笔记第4篇:数据库,1 方案选择【附代码文档】

嘿马头条项目从到完整开发笔记总结完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;课程简介&#xff0c;ToutiaoWeb虚拟机使用说明1 产品介绍,2 原型图与UI图,3 技术架构,4 开发,1 需求,2 注意事项。数据库&#xff0c;理解ORM1 简介,2 安装,3 数据库连接…

计算机网络——37认证

认证 目标&#xff1a;Bob需要Alice证明他的身份 Protocol ap1.0&#xff1a;Alice说"A am Alice" 可能出现的问题&#xff1a; 在网络上Bob看不到Alice&#xff0c;因此Trudy可以简单的声称他是Alice 认证&#xff1a;重新尝试 Protocol ap2.0&#xff1a;Alice…

Unity和Android的交互

Unity和Android的交互 一、前言二、Android导出jar/aar包到Unity2.1 版本说明2.2 拷贝Unity的classes.jar给Android工程2.2.1 classes.jar的位置2.2.2 Android Studio创建module2.2.3 拷贝classes.jar 到 Android工程并启用 2.3 编写Android工程代码2.3.1 创建 MainActivity2.…

前端canvas项目实战——在线图文编辑器(八):复制、删除、锁定、层叠顺序

目录 前言一、效果展示二、实现步骤1. 复制2. 删除3. 锁定4. 层叠顺序 三、实现过程中发现的bug1. clone方法不复制自定义属性2. 复制「锁定」状态的对象&#xff0c;得到的新对象也是「锁定」状态 四、Show u the code后记 前言 上一篇博文中&#xff0c;我们细致的讲解了实现…