0
点赞
收藏
分享

微信扫一扫

【leetcode刷题】--- 我遇到一道很坏很坏的题~

一天清晨 2022-04-18 阅读 88

目录


前言

今天在Leetcode上刷题,看到一道题很有趣。我乍一看,没有思路,但是仔细想了想,还是没思路。。。。哈哈,开个玩笑。

当我写出后解法后,系统老是提醒超出时间限制,太难了,努力想了好久,优化解法后终于通过了!还挺有成就感。

后来在官方的解法中,我又学到了其他的解题方法,解题的思路非常棒,所以就有了这篇文章,想和大家分享一下。


题目

描述:

🔋例如:

✔️示意图:

💡解释:


普通解法

🌱思路一

举例一:

由上图可知,若想求A列上的雨水,则可发现:


举例二:

由上图可知,若想求A列上的雨水,则可发现:

总结:

  • 我们可以对每一列上的雨水量进行计算(最两端的柱子不考虑),最后相加即可。

  • 需要遍历数组,对每一列A的左右两侧BC中,取出较矮的那一列,减去A列的高度就能求出A上接到的雨水量(如例子一

  • 但是如果B,C较矮的那一列比A还要矮,那么A上就没有雨水。(如例子二

🌳代码

这是刚开始我写的代码

但是超出了时间限制:

虽然这个思路不错,但是太耗时间了,通过不了。

那怎样能减低时间复杂度?

当我们分析后发现,上述代码之所以时间复杂度高,是因为对于计算每一列上的雨水量,都必须向两边寻找最大值,这就很耗费时间。

但是,我们可以利用动态规划,先知道每个位置的两侧的最大值是多少,那么就能够更加快速的求出接到的雨水量。也就是说,提前储存每个位置上左边所有柱子中的最大值,以及右边所有柱子中的最大值。

这该如何实现呢?

思路如下:

很幸运!通过了。

那么问题来了,还能想到什么解法呢?

想了很久后,思路二出现了。


🌱思路二

看下图:

  • 我们先找出数组中柱子高度的最大值。
  • 然后乘以数组的大小,得到了一个长方形。
  • 求出这个长方形的面积后,减去白色部分和黑色部分的面积后,就可以得到雨水量!

所以整理一下思路

写出代码如下:

通过了!


其他解法

接下来,我们来欣赏一下其他超棒的解法!

🌱思路三

思路三是利用单调栈的思想。

下面是来自LeetCode官方题解:

代码实现如下:

🌱思路四

思路四是利用双指针的思想。

同样也是官方的解法。

具体如下:


写在最后

说实话,遇到这道很坏很坏的题,确实体会到很多,其中一点就是我好菜。。。

随着刷题次数增加后,当我回过头来看今天记录的这道难题,希望能够更加轻松,彻底的理解与掌握。

对于这道题,你有什么想法呢,欢迎到评论区一起讨论,分享你的解法吧!!!

举报

相关推荐

0 条评论