Trapping Rain Water
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.
这道题来源于leetcode,据说是一道Google的面试题,这儿给出一种比较简单的解法:先计算柱状图的凸包面积,然后减去柱状图本身的面积,就是所能存储水的多少。时间复杂度:O(n),空间复杂度:O(1)。
class Solution {
//O(n) algorithm
public:
int trap(int A[], int n) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
if(n<=2)
return 0;
int sum=A[0],mi=0;
for(int i=1;i<n;i++)
{
sum+=A[i];
if(A[i]>A[mi])
mi=i;
}
int left=0,right=0,min=0;
for(int i=1;i<=mi;i++)
if(A[i]>=A[min])
{
left+=A[min]*(i-min);
min=i;
}
min=n-1;
for(int j=n-2;j>=mi;j--)
if(A[j]>=A[min])
{
right+=A[min]*(min-j);
min=j;
}
return left+right+A[mi]-sum;
}
};
Written by Vincent 强强
Related protips
1 Response
mine is faster
int landscape[] = {0,1,0,2,1,0,1,3,2,1,2,1};
int units = 0 ;
int startBarrrerPos = 0;
int size = sizeof(landscape)/ sizeof(int);
for(int i = 0; i < size-1; i++)
{
if ( landscape[i] >= landscape[startBarrrerPos])
{
startBarrrerPos=i;
continue;
}
if ( landscape[i+1] > landscape[i])
{
int increment = (min(landscape[i+1], landscape[startBarrrerPos])) - landscape[i];
if ( landscape[i+1]>= landscape[startBarrrerPos] )
units+= increment * ((i+1 ) -(startBarrrerPos+1));
else
units+= increment;
}
}
over 1 year ago
·
Have a fresh tip? Share with Coderwall community!
Post
Post a tip
Sponsored by #native_company# — Learn More
#native_title#
#native_desc#