主题 4:攒青豆个人解法分享

106 阅读2分钟

当青训营遇上码上掘金 这道题和LeetCode上个一道颇为出名的题目接雨水类似[接雨水](42. 接雨水 - 力扣(LeetCode)),当时没看题解前没有想到解法,看了题解后一直感觉很绕,当时勉强搞懂,后来马上就忘了。 今天看到这个题的第一眼就是感觉题目很熟悉,马上意识到是接雨水。

突然注意到要计算总和的雨水量,不妨试着考虑每列的青豆量多少是受什么影响,一个很显然的想法,就是受到它临近柱子高度的影响,但是看样例发现邻近的柱子不能完全决定他的青豆量,远处的柱子也会影响他的青豆数量,仔细看样例,似乎每一列收到他左边最高柱子以及它右边最高柱子的影响,与他们距离当前列的距离无关。

思路:

  • 首先计算每一列的青豆量,每一列的青豆数等于 min(leftMax[i],rightMax[i])-heght[i],注意,如果左右的高柱子要小于当前列,那这个值就是负的,无意义,所以实际上应该表示为max(min(leftMax[i],rightMax[i])-heght[i],0)
  • 有了计算思路,因此需要维护两个值,即当前位置左边的最大值leftmax[i]以及当前位置右边的最大值maxRight[i],注意边界。
  • 最后一步就是要把每一列的青豆累加最后输出。

补充:

这个解法的复杂度是O(n),但是算上计算结果,一共用了三个循环,这个题目的解法和思路有很多,我这个解法非最优解法,这个题目还有一个进阶版本的题目407. 接雨水 II - 力扣(LeetCode),这道题把刚才的二维问题转化为三维的问题,难度提升了不少,感兴趣的可以思考一下,这个当前的解法就不适用了。