2014-10-20 11:23:39 +08:00
|
|
|
// Source : https://oj.leetcode.com/problems/trapping-rain-water/
|
|
|
|
// Author : Hao Chen
|
|
|
|
// Date : 2014-07-02
|
|
|
|
|
2014-10-21 10:49:57 +08:00
|
|
|
/**********************************************************************************
|
|
|
|
*
|
2014-10-21 11:39:53 +08:00
|
|
|
* 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.
|
2014-10-21 10:49:57 +08:00
|
|
|
*
|
|
|
|
* For example,
|
|
|
|
* Given [0,1,0,2,1,0,1,3,2,1,2,1], return 6.
|
|
|
|
*
|
2014-10-21 11:39:53 +08:00
|
|
|
* 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!
|
2014-10-21 10:49:57 +08:00
|
|
|
*
|
|
|
|
**********************************************************************************/
|
|
|
|
|
2014-10-20 11:23:39 +08:00
|
|
|
#include <stdio.h>
|
|
|
|
|
|
|
|
int trap(int a[], int n) {
|
|
|
|
int result = 0;
|
|
|
|
|
|
|
|
//find the highest value/position
|
|
|
|
int maxHigh = 0;
|
|
|
|
int maxIdx = 0;
|
|
|
|
for(int i=0; i<n; i++){
|
|
|
|
if (a[i]>maxHigh){
|
|
|
|
maxHigh = a[i];
|
|
|
|
maxIdx = i;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//from the left to the highest postion
|
|
|
|
int prevHigh = 0;
|
|
|
|
for(int i=0; i<maxIdx; i++){
|
|
|
|
if(a[i]>prevHigh){
|
|
|
|
prevHigh = a[i];
|
|
|
|
}
|
|
|
|
result += (prevHigh - a[i]);
|
|
|
|
}
|
|
|
|
|
|
|
|
//from the right to the highest postion
|
|
|
|
prevHigh=0;
|
|
|
|
for(int i=n-1; i>maxIdx; i--){
|
|
|
|
if(a[i]>prevHigh){
|
|
|
|
prevHigh = a[i];
|
|
|
|
}
|
|
|
|
result += (prevHigh - a[i]);
|
|
|
|
}
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
#define TEST(a) printf("%d\n", trap(a, sizeof(a)/sizeof(int)))
|
|
|
|
int main()
|
|
|
|
{
|
|
|
|
int a[]={2,0,2};
|
|
|
|
TEST(a);
|
|
|
|
int b[]={0,1,0,2,1,0,1,3,2,1,2,1};
|
|
|
|
TEST(b);
|
|
|
|
return 0;
|
|
|
|
}
|