题目描述:
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]
, return 6
.
题目分析:
题意比较简单。就是求给定数组组成的一个地形图。计算该地形图积累的雨水容量大小。
每个位置(A[i])的雨水量大小取决于左右地形的最高高度,所以先从左向右扫描,计算每个位置的左边最高高度(left[i]),同理从右向左扫描,得到每个位置右边最高高度(right(i))。对于每个位置的雨水量:min(left[i],right[i])-A[i]。
代码如下:
class Solution {
public:
int trap(int A[], int n) {
vector<int> left(n,0);
int leftHigh=0;
for(int i=0;i<n;i++){
left[i]=leftHigh;
leftHigh=A[i]>leftHigh?A[i]:leftHigh;
}
vector<int> right(n,0);
int rightHigh=0;
for(int i=n-1;i>=0;i--){
right[i]=rightHigh;
rightHigh=A[i]>rightHigh?A[i]:rightHigh;
}
int sum=0;
for(int i=0;i<n;i++){
int cur=min(left[i],right[i])-A[i];
if(cur>0){
sum+=cur;
}
}
return sum;
}
};