代码随想录 Day50 单调栈 LeetCodeT503 下一个最大元素II T42接雨水

前言

前面我们说到了单调栈的第一题,下一个最大元素I,其实今天的两道题都是对他的变种,知道第一个单调栈的思想能够想清楚,其实这道题是很简单的

考虑好三个状态,大于等于小于,其实对于前面这些题目只要细心的小伙伴就会发现其实小于和等于的处理是一样的都是直接入栈,只有大于的才会将栈头一直出栈,最后将该元素入栈.

LeetCode T503 下一个最大元素II

题目链接:503. 下一个更大元素 II - 力扣(LeetCode)

题目思路:

这题的题目思路其实和上一题差不多,都是单调栈的经典例题,这题其实也就是在上一题的基础上加上了可以循环地搜索,其实我们只需要遍历两次数组即可,第一次的最大元素在单调栈

中保存了,第二次再遍历的时候就能达到循环搜索的效果了

这里贴上昨天单调栈的原版的思路链接:

代码和思路基本一样,这里不做过多赘述

代码随想录 Day49 单调栈01 LeetCode LeetCodeT739每日温度 T496 下一个最大元素I-CSDN博客

题目代码:

java 复制代码
class Solution {
    public int[] nextGreaterElements(int[] nums) {
        int[] res = new int[nums.length];
        Arrays.fill(res,-1);
        Stack<Integer> st = new Stack<>();
        st.push(0);
        for(int i = 0;i<2*nums.length;i++){
            int k = i%nums.length;
            if(nums[k]<=nums[st.peek()]){
                st.push(k);
            }else{
                while(!st.isEmpty() && nums[k]>nums[st.peek()]){
                    res[st.peek()] = nums[k];
                    st.pop();
                }
                st.push(k);
            }

        }
        return res;


    }
}

LeetCode T42 接雨水

题目链接:42. 接雨水 - 力扣(LeetCode)

题目思路:

首先明确单调栈是这样计算雨水的,横向计算而不是竖向计算

下面我们考虑递减栈还是递增栈

明显是递增栈,我们需要找到前一个比他大的元素和后一个比他大的元素

因为一旦发现添加的柱子高度大于栈头元素了,此时就出现凹槽了,栈头元素就是凹槽底部的柱子,栈头第二个元素就是凹槽左边的柱子,而添加的元素就是凹槽右边的柱子。

如果遇到相同元素的怎么办??

此时选择弹出第一个相同元素或者不弹出其实都一样

弹出就是只计算一次,

不弹出的话第一次计算完中间高度就会变成5了

右边只要能找到一个大于5的,这样5就是最小值

然后计算高度的时候5减去中间柱子5就变成0了,也就等于没计算

只是计算方式不一样而已

使用宽*高来计算,最后相加就行

.

.

.

.

题目代码:

java 复制代码
class Solution {
    public int trap(int[] height) {
        if(height.length<=2){
            return 0;
        }
        int sum = 0;
        Stack<Integer> st = new Stack<>();
        st.push(0);
        for(int i = 1;i<height.length;i++){
            if(height[i]<=height[st.peek()]){
                st.push(i);
            }else{
                while(!st.isEmpty() && height[i]>height[st.peek()]){
                    int tmp = st.peek();
                    st.pop();
                   if(!st.isEmpty()){
                        int h = Math.min(height[i],height[st.peek()])-height[tmp];
                        int w = i-st.peek()-1;
                        sum += h*w;
                   }
                    
                }
                st.push(i);
               
            }
        }
        return sum;

    }
}
相关推荐
栈溢出了几秒前
GAT(Graph Attention Network)学习笔记
人工智能·深度学习·算法·机器学习
Tutankaaa几秒前
学校知识竞赛怎么组织?从班级到年级的进阶方案
经验分享·学习·算法·职场和发展
qcx232 分钟前
混合检索+重排序:当前 RAG 精度提升最成熟的工程路径
算法·ai·llm·agent·rag·agentic
洛水水4 分钟前
【力扣100题】42.杨辉三角
算法·leetcode·职场和发展
東隅已逝,桑榆非晚8 分钟前
深⼊理解指针(3)
c语言·数据结构·笔记·算法·排序算法
地平线开发者11 分钟前
地平线 征程 6 工具链进阶教程 征程 6E/M 工具链 QAT 精度调优
算法·自动驾驶
小O的算法实验室2 小时前
2025年IEEE TETCI,异构无人机取送货问题中的转运优化,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
chao1898449 小时前
基于 SPEA2 的多目标优化算法 MATLAB 实现
开发语言·算法·matlab
沪漂阿龙9 小时前
AI大模型面试题:支持向量机是什么?间隔最大化、软间隔、核函数、LinearSVC 全面拆解
人工智能·算法·支持向量机
難釋懷9 小时前
Redis数据结构-Set结构
数据结构·redis·bootstrap