【Leetcode】接雨水问题

在leetcode刷题过程中,接雨水问题是比较经典的,特别是笔试面试喜欢出的问题。腾讯,Vivo等大厂都出现过,在这里通过自己学习,以及借鉴大佬的思路,对这道题进行整理。这道题涉及了动态规划单调栈,包括动态规划的一个优化问题,以及单调栈的典型应用。

其它算法问题刷题总结可以参考:基础算法分类总结(持续更新中)

一、接雨水问题全面解析

1. 题目描述

leetcode题目链接:42. 接雨水
在这里插入图片描述

2. 解决方法

在这里插入图片描述

2.1 暴力 时间O(N^2) 空间O(1)

很明显每个柱子顶部可以储水的高度为:该柱子的左右两侧最大高度的较小者减去此柱子的高度。

因此我们只需要遍历每个柱子,累加每个柱子可以储水的高度即可。

class Solution {
   
    public int trap(int[] height) {
   
        int res = 0;
        int n = height.length;
        // 遍历每个柱子
        for (int i = 1; i < n - 1; i++) {
   
            int leftMax = 0, rightMax = 0;
            // 计算当前柱子左侧的柱子中的最大高度
            for (int j = 0; j <= i; j++) {
   
                leftMax = Math.max(leftMax, height[j]);
            }
            // 计算当前柱子右侧的柱子中的最大高度
            for (int j = i; j < n; j++) {
   
                rightMax = Math.max(rightMax, height[j]);
            }
            // 结果中累加当前柱子顶部可以储水的高度,
            // 即 当前柱子左右两边最大高度的较小者 - 当前柱子的高度。
            res += Math.min(leftMax, rightMax) - height[i];
        }
        return res;
    }
}
2.2 动态规划 时间O(N) 空间O(N)

在上述的暴力法中,对于每个柱子,我们都需要从两头重新遍历一遍求出左右两侧的最大高度&#x

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值