单调栈求解算法

例题: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]

求解:
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为最大元素
关键点就是:
while (!stack.isEmpty() && stack.peek() <= nums[i % len])

  

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



 
posted @ 2023-12-20 11:36  Justin_Hu  阅读(20)  评论(0)    收藏  举报