截止到目前我已经写了 500多道算法题,其中部分已经整理成了pdf文档,目前总共有1000多页(并且还会不断的增加),大家可以免费下载

LeetCode 503. 下一个更大元素 II_单调栈



单调栈解决

这题可以参照前面讲的
​​​379,柱状图中最大的矩形(难)​​​​382,每日温度的5种解题思路​​​​386,链表中的下一个更大节点​​​​519,单调栈解下一个更大元素 I​

LeetCode 503. 下一个更大元素 II_i++_02

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;
}