题目描述[原题链接][https://leetcode-cn.com/problems/trapping-rain-water/]
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 感谢 Marcos 贡献此图。
示例:
1 | 输入: [0,1,0,2,1,0,1,3,2,1,2,1] |
算法描述
读完题不知道从何下手,看了题解,很多人都是用的dp的方法做的,对于我而言,dp的难度还是挺大的,所以采用了双指针的做法,指针如何移动,在什么时候移动这些是值得考虑的,初始化时,两指针分别指向开头和结尾,取到当前指针的值,分别比较,如果height[r]>height[l]
时,需要更新左边最大值,看看l
前面的那个值是否比当前左边的最大值大,即max(l_max,height[++l])
,如果height[r]<=height[l]
时,右边的最大值就需要更新了,即max(r_max,height[--r])
;每次更新之后需要讲更新后的值与当前值的差与0比较,添加到答案中,ans+=(0,当前最大值-当前值)
,当左右指针相遇时,结束,返回答案;
C++代码
1 | class Solution { |
Java代码
1 | class Solution { |