LeetCode 503. 下一个更大元素 II
Posted 数据结构和算法
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 503. 下一个更大元素 II相关的知识,希望对你有一定的参考价值。
截止到目前我已经写了 500多道算法题,其中部分已经整理成了pdf文档,目前总共有1000多页(并且还会不断的增加),大家可以免费下载
下载链接:https://pan.baidu.com/s/1hjwK0ZeRxYGB8lIkbKuQgQ
提取码:6666
单调栈解决
这题可以参照前面讲的
379,柱状图中最大的矩形(难)
382,每日温度的5种解题思路
386,链表中的下一个更大节点
519,单调栈解下一个更大元素 I
int res[] = new int[length];
Stack<Integer> stack = new Stack<>();
for (int i = 0; i < length; i++) {
while (!stack.isEmpty() && nums[stack.peek()] < nums[i])
res[stack.pop()] = nums[i];
//当前元素的下标入栈
stack.push(i);
}
对于这道题完全可以套用上面的模板,因为题中说了是循环数组,我们只需要把数组遍历两遍即可,代码如下
public int[] nextGreaterElements(int[] nums) {
int length = nums.length;
int res[] = new int[length];
Arrays.fill(res, -1);//默认都为-1
Stack<Integer> stack = new Stack<>();
//相当于把数组循环两遍
for (int i = 0; i < length * 2; i++) {
//遍历数组的第index(index从0开始)个元素,因为数组会遍历
//两遍,会导致数组越界异常,所以这里要对数组长度进行求余
int index = i % length;
//单调栈,他存储的是元素的下标,不是元素具体值,从栈顶
//到栈底所对应的值是递增的(栈顶元素在数组中对应的值最小,
//栈底元素对应的值最大),如果栈顶元素对应的值比nums[index]小,
//说明栈顶元素对应的值遇到了右边第一个比他大的值,然后栈顶元素出栈,
//让他对应的位置变为nums[index],也就是他右边第一个比他大的值,
//然后继续判断……
while (!stack.isEmpty() && nums[stack.peek()] < nums[index])
res[stack.pop()] = nums[index];
//当前元素的下标入栈
stack.push(index);
}
return res;
}
以上是关于LeetCode 503. 下一个更大元素 II的主要内容,如果未能解决你的问题,请参考以下文章