壹 ❀ 引

我在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. ClickHouse中“大列”造成的JOIN的内存超限问题

    ClickHouse中"大列"造成的JOIN的内存超限问题 "大列"是指单行数据量非常大的列,通常是100KiB以上.这样的列会导致JOIN(通常LEFT JO ...

  2. DC-实验

    设置及综合流程

  3. java - 局部变量和成员变量的区别

    package class_object; /** * 局部变量和成员变量的区别 * * 1. 定义位置 * * 2. 作用域 * * 3. 默认值 => 局部变量没有默认值 * * 4. 内存 ...

  4. Linux-服务管理-service-checkconfig

  5. Go-强制类型转换-T(x)

    类型转换 T(x) 具有相同的底层类型 数字类型之间可以互相转换(int系 uint系 float系),较大数转换成较小数会损失精度 字符串与切片之间的转换 string <==> []r ...

  6. [转帖]11GR2数据库审计日志自动清理

    审计日志如果把SYSTEM表空间撑爆,也会导致数据库停摆,且11g默认审计是开启状态. 今天就遇到了这样的情况,写了下面脚本来实现自动清理工作,记录操作过程. TRUNCATE TABLE SYS.A ...

  7. [转帖]JMeter InfluxDB v2.0 listener plugin

    https://github.com/mderevyankoaqa/jmeter-influxdb2-listener-plugin Support my Ukrainian Family ️ Lik ...

  8. [转帖]VMware常用软件ISO下载汇总(2023年6月更新)

    https://www.dinghui.org/vmware-iso-download.html#vcsa-patch 请访问 www.dinghui.org 获得最新版,文章将持续更新.[最后更新时 ...

  9. ipset的学习与使用

    ipset的学习与使用 场景说明 虽然可以通过: firewall-cmd --zone=trusted --add-source=$1 --permanent && firewall ...

  10. 通过mat获取OOM时对象信息的方法与过程

    通过mat获取OOM时对象信息的方法与过程 背景 如果谁的耐心不好, 就让他去看MAT里的objects信息. 有项目出现了OOM的情况 我在公司这边有一台内存比较高的Win10机器. 然后帮助同事进 ...