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 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它 ...
随机推荐
- Java 使用二分查找快速定位元素位置
转载请注明出处: 快速定位 一个有序数列中 某一个元素的位置: 共有三种思路: 第一种:使用 for 循环,匹配元素值 与循环变量的值是否相等,相等则循环变量时的 i 则为元素位置 第二种:使用 二分 ...
- 6. 配置项:relabel_config
6.1relabel_config的位置 6.2 relabel_config参数详解 1.replace 2. keep 3.drop 6.labelkeep 7.hashmod 6.3 正则表达式 ...
- Julia编程基础
技术背景 Julia目前来说算是一个比较冷门的编程语言,主要是因为它所针对的应用场景实在是比较有限,Julia更注重于科学计算领域的应用.而Julia最大的特点,就是官方所宣传的:拥有C的性能,且可以 ...
- 【linux】Linux内核结构体--kfifo 环状缓冲区
1.前言 最近项目中用到一个环形缓冲区(ring buffer),代码是由linux内核的kfifo改过来的.缓冲区在文件系统中经常用到,通过缓冲区缓解cpu读写内存和读写磁盘的速度.例如一个进程A产 ...
- phpcms : Uncaught Error: [] operator not supported for strings... 的解决方案
打开/phpcms/modules/admin/classes/push_api.class.php,大概在约 141行, $fields_arr = $fields_value = ''; 将它改为 ...
- Spring————IOC入门学习
Spring----入门学习 简介 优点 Spring是一个开源的免费的框架(容器)! Spring是一个轻量级,非入侵式的框架 控制反转(IOC),面向切面编程(AOP) 支持对事务的处理,对框架整 ...
- 【面试题精讲】JVM中有哪些垃圾收集器
有时博客内容会有变动,首发博客是最新的,其他博客地址可能未同步,请认准https://blog.zysicyj.top 首发博客地址 系列文章地址 在Java虚拟机(JVM)中,有以下几种常见的垃圾收 ...
- [转帖]TiKV Config Learn the TiKV configuration file
The TiKV configuration file supports more options than command-line parameters. You can find the def ...
- [转帖]TiDB 环境与系统配置检查
https://docs-archive.pingcap.com/zh/tidb/v6.0/check-before-deployment 本文介绍部署 TiDB 前的环境检查操作,以下各项操作按优先 ...
- [转帖]一文带你搞懂xxl-job(分布式任务调度平台)
https://zhuanlan.zhihu.com/p/625060354 前言 本篇文章主要记录项目中遇到的 xxl-job 的实战,希望能通过这篇文章告诉读者们什么是 xxl-job 以及怎么使 ...