【算法二十二】 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)

相关推荐
碧海银沙音频科技研究院29 分钟前
4 BES2710编译环境搭建方法
嵌入式硬件·算法
mifengxing1 小时前
LeetCode 238 除自身以外数组的乘积|无除法O(n)时间+O(1)空间双解法
java·算法·leetcode
依然鸣1 小时前
PTA团体程序设计天梯赛L2真题讲解L2-045-048
数据结构·c++·经验分享·学习·算法·pat考试·pat
丢掉幻想准备斗争1 小时前
5.5树与二叉树的应用
算法
ZhouDevin2 小时前
算法论文/模型微调2——仅骨干1%~3% 参数达到与全量微调相当的性能
算法
Sinosecu-OCR2 小时前
文通OCR技术深度解析:自研算法如何搞定复杂场景识别?
算法·ocr·ocr识别系统
CQU_JIAKE2 小时前
8.5【A】
数据结构·算法
ESBK20252 小时前
学术邀约|CMICA 2026 第二届计算方法、智能控制与航空航天国际会议
大数据·人工智能·算法·飞行器·智能控制·航空航天·计算
无bug代码搬运工3 小时前
LeetCode 42 接雨水:双指针解法详解
算法·leetcode·职场和发展
Jasmine_llq3 小时前
《P13016 [GESP202506 六级] 最大因数》
数据结构·算法