给出 n 个非负整数,代表一张X轴上每个区域宽度为 1
的海拔图,
计算这个海拔图最多能接住多少(面积)雨水。
样例
如上图所示,海拔分别为 [0,1,0,2,1,0,1,3,2,1,2,1]
,
返回 6
.
挑战
O(n) 时间, O(1) 空间
O(n) 时间, O(n) 空间也可以接受
分析:只能遍历一遍,且不能存储所有的高度,一块直柱能接的水取决于左右两边较短的高度,所以一个比较直观的方法是从左到有遍历一遍记录该点左边的最大值,从右到左遍历一遍记录该点的右边的最大值,此方法为O(n)
时间, O(n) 空间,第二种方法可以利用单调递减栈来实现,此方法为O(n) 时间, O(n) 空间,第三种方法为先找出中间最大点,然后左边部分相当于已经确定了右边最大值,左指针不断向右逼近就行,右边部分相当于记录了左边最大值,右指针不断向左逼近就行,此方法为O(n)
时间, O(1) 空间,第四种方法类似第三种,左右夹逼,每次选择小的那个指针向中间靠拢,此方法为O(n) 时间, O(1) 空间,但是要比方法三少遍历一遍。
我们在这里实现第四种最优的方案:
代码:
class Solution { public: /** * @param heights: a vector of integers * @return: a integer */ int trapRainWater(vector<int> &heights) { // write your code here int ret = 0; if(heights.size()==0) return ret; int lmax = 0, rmax = 0; int l = 0, r = heights.size()-1; while(l<r) { lmax = max(lmax,heights[l]); rmax = max(rmax,heights[r]); if(lmax<rmax) ret += lmax-heights[l],l++; else ret += rmax-heights[r],r--; } return ret; } };
时间: 2024-10-10 14:00:11