【代码随想录算法训练营第五十五天|742.接雨水、84.柱状图中最大的矩形】

文章目录

42.接雨水

双指针

其实感觉和双指针关系不大(如果是优化前的版本确实是双指针),因为每一个木块位置能存放的水的数量取决于他所处位置的水平线,水平线则是由它的向左找到的最大值和向右找到的最大值中的短板,拿水平线减去木板高度就是这个位置能找到的最大储水。

copy两次height生成每个位置的向左最大高度和向右最大高度(用height作为初值是因为这个高度至少要大于当前木板高度)。然后对于每个木板,他的向左最大高度可以通过前一个位置的向左最大高度和自身高度比较取大的值,向右同理。

python 复制代码
class Solution:
    def trap(self, height: List[int]) -> int:
        l = len(height)
        max_left = height[:]
        max_right = height[:]
        ans = 0
        for i in range(1, l):
            max_left[i] = max(max_left[i-1], height[i])
        for i in range(l-2, -1, -1):
            max_right[i] = max(max_right[i+1], height[i])
        for i in range(1, l-1):
            ans += min(max_left[i], max_right[i]) - height[i]
        return ans

单调栈

用单调栈来保存遍历过的木板,保持栈底到栈头从大到小的顺序,如果新的木板大于栈头的木板,则出栈,该木板决定了现在这个木桶的桶底的高度,然后还需要再判断一次栈是否为空,只有不为空的时候才能再取到左木板,使用这三块木板算出当前桶的存水量。

因为栈顶的木板是确定桶底高度,所以右木板必须高于它的时候才可以进行使用。

python 复制代码
class Solution:
    def trap(self, height: List[int]) -> int:
        st = [0]
        ans = 0
        for i in range(1, len(height)):
            while st and height[i] > height[st[-1]]:
                bottom = st.pop()
                if st:
                    ans += (min(height[st[-1]], height[i]) - height[bottom]) * (i - st[-1] - 1)
            st.append(i)
        return ans

84.柱状图中最大的矩形

和上一题是反过来的,这一题是对每个矩形往两边去找第一个小于他的值,然后在这两个值的范围内算出这个高度的可以围成的最大面积,所以单调栈栈底到栈头是从小到大,方便找到左边第一个小于它的索引。由于不像上一题最左右的两块不能参与到计算中,这一题最左右的矩形是需要计算它的可能围成面积的,所以需要额外在头尾加上一个0。

python 复制代码
class Solution:
    def largestRectangleArea(self, heights: List[int]) -> int:
        st = [0]
        heights.insert(0, 0)
        heights.append(0)
        ans = 0
        for i in range(1, len(heights)):
            while st and heights[i] < heights[st[-1]]:
                height = st.pop()
                if st:
                    ans = max(ans, heights[height]*(i-st[-1]-1))
            st.append(i)
        return ans
相关推荐
DanyHope2 分钟前
LeetCode 两数之和:从 O (n²) 到 O (n),空间换时间的经典实践
前端·javascript·算法·leetcode·职场和发展
free-elcmacom9 分钟前
机器学习高阶教程<6>推荐系统高阶修炼手册:混排、多任务与在线学习,解锁精准推荐新境界
人工智能·python·学习·算法·机器学习·机器人
断剑zou天涯9 分钟前
【算法笔记】AC自动机
java·笔记·算法
IT猿手12 分钟前
基于粒子群算法与动态窗口混合的无人机三维动态避障路径规划研究,MATLAB代码
算法·matlab·无人机·多目标优化算法·多目标算法
民乐团扒谱机13 分钟前
【微实验】仿AU音频编辑器开发实践:从零构建音频可视化工具
算法·c#·仿真·audio·fft·频谱
DanyHope16 分钟前
LeetCode 283. 移动零:双指针双解法(原地交换 + 覆盖补零)全解析
数据结构·算法·leetcode
bulingg31 分钟前
集成模型:gbdt,xgboost,lightgbm,catboost
人工智能·算法·机器学习
d111111111d33 分钟前
编码器测速详情解释:PID闭环控制
笔记·stm32·单片机·嵌入式硬件·学习·算法
麒qiqi38 分钟前
【Linux 进程间通信】信号通信与共享内存核心解析
java·linux·算法
肆悟先生1 小时前
3.15 引用类型
c++·算法