壹 ❀ 引

我在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 题解分析,依旧单调栈做法解决此题的更多相关文章

  1. LeetCode 503. 下一个更大元素 II(Next Greater Element II)

    503. 下一个更大元素 II 503. Next Greater Element II 题目描述 给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素.数字 ...

  2. Java实现 LeetCode 503 下一个更大元素 II

    503. 下一个更大元素 II 给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素.数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大 ...

  3. Leetcode 503. 下一个更大元素 II

    1.题目描述 给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素.数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应 ...

  4. 503. 下一个更大元素 II

    503. 下一个更大元素 II 给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素.数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大 ...

  5. Leetcode 503.下一个更大元素

    下一个更大元素 给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素.数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你 ...

  6. LeetCode 556. 下一个更大元素 III(Next Greater Element III)

    556. 下一个更大元素 III 556. Next Greater Element III 题目描述 给定一个 32 位正整数 n,你需要找到最小的 32 位整数,其与 n 中存在的位数完全相同,并 ...

  7. LeetCode 496. 下一个更大元素 I(Next Greater Element I) 35

    496. 下一个更大元素 I 496. Next Greater Element I 题目描述 给定两个没有重复元素的数组 nums1 和 nums2,其中 nums1 是 nums2 的子集.找到  ...

  8. LeetCode:下一个更大元素I【31】

    LeetCode:下一个更大元素I[31] 题目描述 给定两个没有重复元素的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集.找到 nums1 中每个元素在 nums2 中的 ...

  9. Leetcode 496. 下一个更大元素 I

    1.题目描述 给定两个没有重复元素的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集.找到 nums1 中每个元素在 nums2 中的下一个比其大的值. nums1 中数字  ...

  10. 503 Next Greater Element II 下一个更大元素 II

    给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素.数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它 ...

随机推荐

  1. appium(二)安装(Android)

    一.安装Appium-desktop 1.官网下载安装包: http://appium.io/

  2. 【Linux API 揭秘】module_init与module_exit

    [Linux API 揭秘]module_init与module_exit Linux Version:6.6 Author:Donge Github:linux-api-insides 1.函数作用 ...

  3. Redis异常问题分析黄金一分钟

    Redis异常问题分析黄金一分钟 背景 同事发现一个环境redis比较卡顿,导致业务比较难以开展. 问题是下午出现的. 六点左右找到我这边. 想着帮忙看看, 问题其实没有定位完全, 仅是发现了一个可能 ...

  4. iftop的学习与使用

    iftop的学习与使用 背景 前段时间一直进行netperf 等网络性能验证工具的学习与使用. 监控很多时候采用了 node-exporter + prometheus + grafana来进行观察 ...

  5. [转帖]Innodb存储引擎-备份和恢复(分类、冷备、热备、逻辑备份、二进制日志备份和恢复、快照备份、复制)

    文章目录 备份和恢复 分类 冷备 热备 逻辑备份 mysqldump SELECT...INTO OUTFILE 恢复 二进制日志备份与恢复 快照备份(完全备份) 复制 快照+复制的备份架构 备份和恢 ...

  6. [转帖]TaiShan v110 - Microarchitectures - HiSilicon

      https://en.wikichip.org/wiki/hisilicon/microarchitectures/taishan_v110 Edit Values TaiShan v110 µa ...

  7. OpenSSH 9.2P1升级以及版本显示的处理过程

    说明 本次维护的时间是 2023-2-9 最新已发布的补丁是 OpenSSH9.2P1版本 其他本本应该是类似处理. 下载介质 在 OpenSSH官网打开相关界面. http://www.openss ...

  8. vim 复制代码的方法

    之前vim 复制代码 总是格式变错乱了 尤其是yaml文件 有的还带注释 非常痛苦 今天早上查了下 原来处理的方式非常简单  增加一个参数就可以了 方法为 1. vim 打开一个文件 2.输入 :se ...

  9. Python设计模式:你的代码真的够优雅吗?

    当涉及到代码优化时,Python作为一种高级编程语言,具有广泛的应用领域和强大的功能.在软件开发中,设计模式是一种被广泛采用的解决问题的方案,它提供了一种在特定情境中重复使用的可行方案.在Python ...

  10. Ant Design Vue 单文件上传Upload

    单文件上传 <a-upload name="file" :beforeUpload="beforeUpload" :multiple="fals ...