题目描述
Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it is able to trap after raining.
For example,
Given[0,1,0,2,1,0,1,3,2,1,2,1], return6.
The above elevation map is represented by array [0,1,0,2,1,0,1,3,2,1,2,1]. In this case, 6 units of rain water (blue section) are being trapped. Thanks Marcos for contributing this image!
分析:设置两个指针,分别指向数组的首尾。首先比较两指针指向的数字大小,用一个变量lrmin记下较小的数,让数字较小的指针先向中间移动,比较这个指针当前所指的数和lrmin的大小,当当前数字较小时,则说明会有凹槽,产生积水(此时右边的指针所指数比左边的指针所指数大),这时累加积水量,否则更新参考变量lrmin。只需扫描一遍数组,时间复杂度为O(N),空间的复杂度为O(1)。
class Solution {
public:
int trap(int A[], int n) {
if(A ==nullptr || n == 0)
return 0;
int l = 0;
int r = n-1;
int res = 0;
while(l<r)
{
int lrmin = min(A[l],A[r]);
if(A[l] == lrmin)
{
l++;
while(l<r && A[l]<lrmin)
{
res += lrmin-A[l];
l++;
}
}
else
{
r--;
while(l<r && A[r]<lrmin)
{
res += lrmin-A[r];
r--;
}
}
}
return res;
}
};