难度:3
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
.
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!
第一感觉是DP,这特么是定式思维。。虽然动态规划能做
不过有个更省空间的方法
首先找到最高的,然后从左往最高处扫,碰到一个数A[i],计算A[0,,,i-1]最高的是否高过A[i],如果是,则A[i]上的水的体积为max(A[0...i-1])-A[i],否则为0并且更新最大值
从右往最高处再同样扫一遍
1Y
class Solution
{
public:
int trap(int A[], int n)
{
if(n <= 2) return 0;
//sum
//
int maxid=0;
for(int i=0;i<n;i++)
{
if(A[i]>A[maxid])
{
maxid=i;
}
}
//已找到最高值
int water=0;
int cur_high=A[0];
for(int i = 1;i<maxid;i++)
{
if(A[i]>cur_high) cur_high=A[i];
else water+=cur_high-A[i];
}
cur_high=A[n-1];
for(int i=n-2;i>maxid;i--)
{
if(A[i]>cur_high) cur_high=A[i];
else water+=cur_high-A[i];
}
return water;
}
};