【单调栈】最大宽度坡

java 复制代码
public int maxWidthRamp(int[] nums) {
        /*  此方法思路正确,但超时
              int n = nums.length;
              Deque<Integer> stack;
              int max = 0;
              for (int i = 0; i < n; i++) {
                 stack = new LinkedList<>();
                 stack.push(nums[i]);
                 int j = i + 1;
                 while (j < n) {
                   stack.push(nums[j]);
                   if (nums[j] >= nums[i] && stack.size() > max) {
                      max = stack.size();
                   }
                   j++;
                }
              }
              return max == 0 ? 0 : max - 1;
         */

        /**
         * 单调栈, 栈中存储的是从nums[0]开始的递减序列的下标,这些递减序列就是栈底
         *          然后逆序遍历数组计算哪个坡度最宽即可。
         *
         * 这里有个问题就是:为什么栈中代表的数据就是栈底呢?
         *     我们最后要求的最大的宽度坡一定是以这个序列中的某一个i为坡底的,我们反证一下:
         *     假设存在某个元素位置k不存在于上面的递减序列中,且有最大宽度j-k,
         *     这也就说明k位置的元素一定是小于k前面所有的元素的,否则就会有更长的宽度,
         *     但是既然k小于前面所有的元素,那么k就一定会被加入到该递减序列中,
         *     与假设矛盾,所以不存在k,解一定存在递减序列中
         *
         *      以 [6, 1, 8, 2, 0, 5] 为例,可以带入试验。
         */
        int n = nums.length;
        int max = 0;
        Deque<Integer> stack = new LinkedList<>();
        for (int i = 0; i < n; i++) {
            if (stack.isEmpty() || nums[stack.peek()] > nums[i]) {
                stack.push(i);
            }
        }
        for (int i = n - 1; i >= 0; i--) {
            while (!stack.isEmpty() && nums[stack.peek()] <= nums[i]) {
                int pos = stack.poll();
                max = Math.max(max,i - pos);
            }
        }
        return max;
    }
相关推荐
鶴哥只手遮天1 小时前
Spring AI 2.0.1 深度解析-第 14 章 MCP 服务端(上):注解式实现与工具来源
java·人工智能·开源
鶴哥只手遮天1 小时前
Spring AI 2.0.1 深度解析-第 15 章 MCP 服务端(下):三种协议形态、Streamable 传输与状态管理
java·人工智能·开源
鶴哥只手遮天1 小时前
Spring AI 2.0.1 深度解析-第 16 章 向量存储(上):`VectorStore` 接口体系、`BatchingStrategy`
java·人工智能·开源
鶴哥只手遮天1 小时前
Spring AI 2.0.1 深度解析-第 12 章 工具循环的流式形态、Usage 累加与扩展体系
java·人工智能·开源
鶴哥只手遮天1 小时前
Spring AI 2.0.1 深度解析-第 23 章 模型供应商实现:从 `OpenAiSetup` 到 Bedrock
java·人工智能·开源
鶴哥只手遮天1 小时前
Spring AI 2.0.1 深度解析-第 06 章 内置 Advisor 全景:13 个实现逐个剖到源码级
java·人工智能·开源
鶴哥只手遮天1 小时前
Spring AI 2.0.1 深度解析-第 03 章 消息体系与 Prompt:不可变模型、`ChatOptions` 与模板渲染
java·人工智能·开源
鶴哥只手遮天1 小时前
Spring AI 2.0.1 深度解析-第 24 章 生产实践与 2.x 迁移:陷阱清单、AOT 与调优
java·人工智能·开源
鶴哥只手遮天1 小时前
Spring AI 2.0.1 深度解析-第 10 章 工具调用(中):执行链路、结果转换与工具限制
java·人工智能·开源
鶴哥只手遮天1 小时前
Spring AI 2.0.1 深度解析-第 13 章 MCP 客户端:传输、工具聚合与命名冲突
java·人工智能·开源