【算法二十二】 739. 每日温度 42.接雨水

739. 每日温度

单调栈:

java 复制代码
class Solution {
    public int[] dailyTemperatures(int[] temperatures) {
        int n = temperatures.length;
        Deque<Integer> stack = new ArrayDeque<>();
        int[] ans = new int[n];
        for(int i = 0;i<n;i++){
            while(!stack.isEmpty() && temperatures[i]>temperatures[stack.peek()]){
                int j = stack.pop();
                
            }
        }
    }
}

时间复杂度:O(N)

空间复杂度:O(N)

核心:

遇到"找右边第一个比我大的数"、"找左边第一个比我小的数"

处理"凹"或"凸"的形状: 比如接雨水(找凹槽)或者最大矩形面积(找左右边界)

计算"跨度"或"贡献": 某个数在什么范围内是最大的?(比如:子数组最小值之和)

42. 接雨水

双指针:

java 复制代码
class Solution {
    public int trap(int[] height) {
        int ans = 0;
        int left = 0;
        int right = height.length - 1;
        int preMax = 0;
        int behMax = 0;
        while(left < right){
            //计算高度包含本高度的原因是,不需要写 if-else 去判断当前柱子是否比最大高度矮
            //矮的可以存水,高的不能存水
            //代码通过一次减法自动兼容了存水还是不能存水的逻辑
            preMax = Math.max(preMax,height[left]);
            behMax = Math.max(behMax,height[right]);
            if(preMax < behMax){
                ans += preMax - height[left];
                left++;
            }
            else{
                ans += behMax - height[right];
                right--;
            }
        }
        return ans;
    }
}

时间复杂度:O(N)

空间复杂度:O(1)

核心:Math.min(preMax,behMax) - heighti

单调栈:

java 复制代码
class Solution {
    public int trap(int[] height) {
        int ans = 0;
        Deque<Integer> stack = new ArrayDeque<>();
        for(int i = 0;i<height.length;i++){
            while(!stack.isEmpty() && height[stack.peek()]<height[i]){
                int bottom = height[stack.pop()];
                if(stack.isEmpty()){
                    break;
                }
                int left = stack.peek();
                int h = Math.min(height[left],height[i])-bottom;
                ans += h*(i-left-1);
            }
            stack.push(i);
        }
        return ans;
    }
}

时间复杂度:O(N)

空间复杂度:O(N)

相关推荐
星星.7222 小时前
C++算法竞赛|二分查找与二分答案:边界模板、浮点二分、STL
数据结构·c++·算法
sel_92 小时前
【OPD论文导读(二)】OPD(On-Policy Distillation)全景调研:十篇论文讲透“在自己生成的内容上学习“这件事
人工智能·python·深度学习·学习·算法·语言模型
金幄科技2 小时前
RAG第四篇:重排序 Rerank——粗召回之后,为什么还需要一次精排
人工智能·算法·ai·ai编程
M78佐菲3 小时前
Linux学习笔记:文件IO
linux·笔记·学习·算法
lhldsg3 小时前
课程排课系统实战指南:从数据库设计到算法调优全流程解析
java·数据库·算法·小程序
BSD_HY3 小时前
薄膜开关矩阵扫描电路设计中的防鬼键措施
人工智能·算法·矩阵·人机交互·薄膜开关·源头工厂·深圳工厂
linux-hzh3 小时前
百日算法修炼 · Day 17
数据结构·算法
XUEYUAN52123 小时前
代理日志分析与监控:代理池健康状态巡检与分级告警体系搭建(运维实战)
运维·网络·网络协议·tcp/ip·算法·架构
sel_94 小时前
【多轮对话论文导读(七)】多轮对话论文阅读笔记:从数据生成、用户模拟到上下文重构与长期记忆
论文阅读·人工智能·笔记·深度学习·算法·语言模型·自然语言处理
远游客07134 小时前
为什么用「年×100+月」做比较
算法·gin