目录
前言
今天在Leetcode上刷题,看到一道题很有趣。我乍一看,没有思路,但是仔细想了想,还是没思路。。。。哈哈,开个玩笑。
当我写出后解法后,系统老是提醒超出时间限制,太难了,努力想了好久,优化解法后终于通过了!还挺有成就感。
后来在官方的解法中,我又学到了其他的解题方法,解题的思路非常棒,所以就有了这篇文章,想和大家分享一下。
题目
✨描述:
🔋例如:
✔️示意图:
💡解释:
普通解法
🌱思路一
举例一:
由上图可知,若想求A列上的雨水,则可发现:
举例二:
由上图可知,若想求A列上的雨水,则可发现:
总结:
-
我们可以对每一列上的雨水量进行计算(最两端的柱子不考虑),最后相加即可。
-
需要遍历数组,对每一列A的左右两侧
B
,C
中,取出较矮的那一列,减去A
列的高度就能求出A
上接到的雨水量(如例子一) -
但是如果
B,C
较矮的那一列比A
还要矮,那么A
上就没有雨水。(如例子二)
🌳代码
这是刚开始我写的代码:
但是超出了时间限制:
虽然这个思路不错,但是太耗时间了,通过不了。
那怎样能减低时间复杂度?
当我们分析后发现,上述代码之所以时间复杂度高,是因为对于计算每一列上的雨水量,都必须向两边寻找最大值,这就很耗费时间。
但是,我们可以利用动态规划,先知道每个位置的两侧的最大值是多少,那么就能够更加快速的求出接到的雨水量。也就是说,提前储存每个位置上左边所有柱子中的最大值,以及右边所有柱子中的最大值。
这该如何实现呢?
思路如下:
很幸运!通过了。
那么问题来了,还能想到什么解法呢?
想了很久后,思路二出现了。
🌱思路二
看下图:
- 我们先找出数组中柱子高度的最大值。
- 然后乘以数组的大小,得到了一个长方形。
- 求出这个长方形的面积后,减去白色部分和黑色部分的面积后,就可以得到雨水量!
所以整理一下思路
写出代码如下:
通过了!
其他解法
接下来,我们来欣赏一下其他超棒的解法!
🌱思路三
思路三是利用单调栈的思想。
下面是来自LeetCode官方题解:
代码实现如下:
🌱思路四
思路四是利用双指针的思想。
同样也是官方的解法。
具体如下:
写在最后
说实话,遇到这道很坏很坏的题,确实体会到很多,其中一点就是我好菜。。。
随着刷题次数增加后,当我回过头来看今天记录的这道难题,希望能够更加轻松,彻底的理解与掌握。
对于这道题,你有什么想法呢,欢迎到评论区一起讨论,分享你的解法吧!!!