单调栈求解算法

例题:503. 下一个更大元素 II

给定一个循环数组 nums ( nums[nums.length - 1] 的下一个元素是 nums[0] ),返回 nums 中每个元素的 下一个更大元素 。

数字 x 的 下一个更大的元素 是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1 。

示例 1:

输入: nums = [1,2,1]
输出: [2,-1,2]
解释: 第一个 1 的下一个更大的数是 2;
数字 2 找不到下一个更大的数; 
第二个 1 的下一个最大的数需要循环搜索,结果也是 2。

示例 2:

输入: nums = [1,2,3,4,3]
输出: [2,3,4,-1,4]

求解:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class NUM_503 {
    public int[] nextGreaterElements(int[] nums) {
        // 1、创建一个栈
        Stack<Integer> stack = new Stack<>();
        int len = nums.length;
        // 2、创建一个保存结果的数组
        int[] ret = new int[len];
        for (int i = 2 * len - 1; i >= 0; i--) {
            while (!stack.isEmpty() && stack.peek() <= nums[i % len]) {
                stack.pop(); // 当前元素比栈顶元素小,就出栈,
            }
            ret[i % len] = stack.isEmpty() ? -1 : stack.peek();
            stack.push(nums[i % len]);
        }
        return ret;
    }
}

 解析:

此题和一般的单调栈相比,数组是一个循环数组,和一般的相比只需要让循环的长度变成2倍的数组长度即可
1、下一个最大元元素,找当前元素右边的元素,所以倒着遍历数组
2、找当前元素左边最小的元素,就正着遍历数组
3、一个栈+一个while循环

为啥倒着遍历:
例如,2,4,3,5,6,7,1
输出:5 5 5 7 -1 -1
倒着遍历:1的下一个元素,没有,故-1;
7的下一个元素为1,故-1,把7入栈
对于6而言,6比7小,故6对应的7
5比6小,所以是6;
3比5小,对应3的结果就是5;
当遍历到4时,栈的元素是3,4比3大,所以要把3出栈,原因很简单:因为4比3大,3没有必要存在栈中,因为下一个元素如果以4为最大元素,那肯定不会遍历到3,如果不以4为最大元素,那肯定也不会以3为最大元素
关键点就是:
1
while (!stack.isEmpty() && stack.peek() <= nums[i % len])

  

如果找数组中,左边第一个比他小的数,只需要正向遍历,修改while中的条件即可



 
posted @   Justin_Hu  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示