JS Leetcode 503. 下一个更大元素 II 题解分析,依旧单调栈做法解决此题
壹 ❀ 引
我在JS Leetcode 496. 下一个更大元素 I 更清晰的图解单调栈做法一文中,介绍了单调栈做法解决下一个更大元素的问题,比较巧的是这道题还有升级版,题目来自Leetcode503. 下一个更大元素 II,描述如下:
给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1。
示例 1:
输入: [1,2,1]
输出: [2,-1,2]
解释: 第一个 1 的下一个更大的数是 2;
数字 2 找不到下一个更大的数;
第二个 1 的下一个最大的数需要循环搜索,结果也是 2。
这是第一道中等难度的题,但如果我们已知单调栈的玩法,你会发现此题难度就急剧下降了。
贰 ❀ 简单的分析与单调栈做法
与上道题相比,升级版的题其实就是多了循环的条件,比如例子[1,2,1]按照之前的题,最后一个元素很明显找不到,应该记录为-1,但在本题中,最后的1可以循环重新开始找,遇到第一个比自己大的元素,也就是2,因此记录为2。
由于单调栈的具体做法在上题中已经介绍的很清楚了,所以这里不再复述,若不清楚推荐阅读上题的题解。所以对于此题,我们需要考虑的其实是解决循环的问题,较为直观的做法自然是将数组长度乘以2,这样就能保证数组最后的一个元素都能进行一次完整的查找。
那么问题又来了,长度乘以2,那岂不是要记录数字也变多了,可明明数组只是被加倍循环了一次而已,对于[1,2,1]而言,下标0与小标3需要做的处理相同,怎么办?灵机一动,我们完全可以借用取余来做次处理。
比如上面例子数组的长度是3,取余就有如下现象:
0 % 3//0
1 % 3//1
2 % 3//2
3 % 3//0
4 % 3//1
5 % 3//2
...
数组长度虽然乘以了2,但完全可以利用i % length来记录重复的结果。所以结合之前单调栈的做法,直接上代码:
/**
* @param {number[]} nums
* @return {number[]}
*/
var nextGreaterElements = function (nums) {
let stack = [];
let len = nums.length;
let ans = [];
// 还是一样的倒序循环,这里只是把长度加倍了而已,回想下站队后往后看第一个比自己高的人。
for (let i = len * 2 - 1; i >= 0; i--) {
// 只要栈不为空,且当前的元素要高于或者等于栈顶的元素,那前面的人都会第一个看到当前遍历到的人,所以栈里的人没保存的必要了
while (stack.length && nums[i % len] >= stack[stack.length - 1]) {
stack.pop();
};
// 跟上道题没差别,只是i变成了i%len
ans[i % len] = stack.length ? stack[stack.length - 1] : -1;
stack.push(nums[i % len])
};
return ans;
};
在上述代码中,我们仅仅是将数组长度乘以了2,并不是真的凑出了一个[1,2,1,1,2,1]的数组,所以当下标为5时,是无法从[1,2,1]中找到对应元素的,机智的做法就是上面的取余操作,这样对于完整倍数的下标,我们总能重复取到相同的元素,那么本题大概如此了。
JS Leetcode 503. 下一个更大元素 II 题解分析,依旧单调栈做法解决此题的更多相关文章
- LeetCode 503. 下一个更大元素 II(Next Greater Element II)
503. 下一个更大元素 II 503. Next Greater Element II 题目描述 给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素.数字 ...
- Java实现 LeetCode 503 下一个更大元素 II
503. 下一个更大元素 II 给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素.数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大 ...
- Leetcode 503. 下一个更大元素 II
1.题目描述 给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素.数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应 ...
- 503. 下一个更大元素 II
503. 下一个更大元素 II 给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素.数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大 ...
- Leetcode 503.下一个更大元素
下一个更大元素 给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素.数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你 ...
- LeetCode 556. 下一个更大元素 III(Next Greater Element III)
556. 下一个更大元素 III 556. Next Greater Element III 题目描述 给定一个 32 位正整数 n,你需要找到最小的 32 位整数,其与 n 中存在的位数完全相同,并 ...
- LeetCode 496. 下一个更大元素 I(Next Greater Element I) 35
496. 下一个更大元素 I 496. Next Greater Element I 题目描述 给定两个没有重复元素的数组 nums1 和 nums2,其中 nums1 是 nums2 的子集.找到 ...
- LeetCode:下一个更大元素I【31】
LeetCode:下一个更大元素I[31] 题目描述 给定两个没有重复元素的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集.找到 nums1 中每个元素在 nums2 中的 ...
- Leetcode 496. 下一个更大元素 I
1.题目描述 给定两个没有重复元素的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集.找到 nums1 中每个元素在 nums2 中的下一个比其大的值. nums1 中数字 ...
- 503 Next Greater Element II 下一个更大元素 II
给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素.数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它 ...
随机推荐
- HTTP协议六种请求:GET,HEAD,PUT,DELETE,POST
Http定义了与服务器交互的不同方法,标准Http协议支持六种请求方法,即: 1.GET 2.POST 3.PUT 4.Delete 5.HEAD 6.Options 最基本的方法有4种,分别是GET ...
- springboot启动流程 (2) 组件扫描
SpringBoot的组件扫描是基于Spring @ComponentScan注解实现的,该注解使用basePackages和basePackageClasses配置扫描的包,如果未配置这两个参数,S ...
- 【MicroPython】生成Q(string)符号表文件 - py\makeqstrdefs.py
脚本使用格式 python py/makeqstrdefs.py [command] [mode] [input-file] [output-directory] [output-file] comm ...
- JMS微服务开发示例(七)使用 Serilog 作为日志提供者
nuget 引入: Serilog.Extensions.LoggingSerilog.Settings.ConfigurationSerilog.Sinks.ConsoleSerilog.Sinks ...
- [转帖]TLS 加速技术:Intel QuickAssist Technology(QAT)解决方案
https://zhuanlan.zhihu.com/p/631184323 3 人赞同了该文章 作者:vivo 互联网服务器团队- Ye Feng 本文介绍了 Intel QAT 技术方案,通过 ...
- [转帖]故障分析 | 让top命令直接显示Java线程名?-- 解析OpenJDK的一个bug修复
https://zhuanlan.zhihu.com/p/413136873 作者:阎虎青DBLE 开源项目负责人,负责分布式数据库中间件研发工作:持续专注于数据库方面的技术,始终在一线从事开发:对数 ...
- 达梦数据库varchar和nvarchar的验证
达梦数据库varchar和nvarchar的验证 测试SQL create tablespace zhaobsh datafile '/opt/dmdbms/data/DAMENG/zhaobsh.d ...
- Python学习之十四_Python连接各种数据库的方法(DM,oscar,Oracle,SQLSERVER,MYSQL,PG,Kingbase
Python学习之十四_Python连接各种数据库的方法(DM,oscar,Oracle,SQLSERVER,MYSQL,PG,Kingbase) 前言 想着能够使用多种数据库进行一些操作. 所以本文 ...
- Numa以及其他内存参数等对Oracle的影响
Numa以及其他内存参数等对Oracle的影响 背景知识: Numa的理解 Numa 分一致性内存访问结构 主要是对应UMA 一致性内存访问而言的. 在最初一个服务器只有一个CPU的场景下, 都是UM ...
- 通过浪潮服务器序列号查询硬件配置以及CPU的价格
最近想知道具体CPU的配置和价格. 发现可以使用如此方式进行查询 https://www.intel.cn/content/www/cn/zh/products/details/processors/ ...