leetcode-42. 接雨水
接雨水
给定 n
个非负整数表示每个宽度为 1
的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]
输出:6
解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1]
表示的高度图,在这种情况下,可以接 6
个单位的雨水(蓝色部分表示雨水)。
按列来计算,第i
列接到的雨水等于min(i左边最大高度,i右边最大高度)-height[i]
.
所以问题的关键就变成了求i
左右两边的最大高度。这是一个非常简单的动态规划问题。
定义
left
数组,left[i]
表示i
左边最大高度(包括i,如果i左边最大高度就是height[i]
,则第i
列接不到雨水,右边同理)。初始化left[0]=height[0]
left[i]=max(left[i-1],height[i])
定义
right
数组,right[i]
表示i
右边最大高度。 初始化right[n-1]=height[n-1]
right[i]=max(right[i+1],height[i])
注意: right
数组必须从后往前遍历。第一次就写反了.
1 | class Solution { |
时空复杂度均为O(n)
.
仔细看上边代码,会发现没有必要设置两个数组。因为对于left
数组只会用到left[i-1]
和left[i]
,right
同理。所以可以用双指针将空间复杂度优化到常数。
设置两个指针left
和right
初始时分别指向0
和n-1
,相向移动。两指针相遇时返回ans
1 | class Solution { |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 面试资料!