接雨水问题
问题简述
给定一个整形数组arr,已知其中所有的值都是非负的,将这个数组看作一个柱子高度图,计算按此排列的柱子,下雨之后能接多少雨水。(数组以外的区域高度视为0)
要求:时间复杂度 O(N)
思路1
使用两个数组分别记录从左到右、从右到左的在当前位置的最大值;
以 [3,1,2,5,2,4] 为例: L = [3,3,3,5,5,5] R = [5,5,5,5,4,4] 则 ret = sum(min(L[i], R[i]) - arr[i] for i in range(N))
空间复杂度
O(N)
;遍历技巧,一次遍历同时生成
L
和R
;
思路2:双指针
在思路 1 的基础上利用双指针优化空间复杂度;
写法 1 和写法 2 都是在思路 1 的基础上优化;
写法 3 提供了一种全局的思路;
Last updated