标签:
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!
Subscribe to see which companies asked this question
思路一:
观察水的分布可发现,水位的分布情况显现梯形的,即先上升后下降。
因此可以先求出最高点,然后左右两边往中间遍历求水的容量。
c++ code:
class Solution {
public:
int trap(vector<int>& height) {
int size = height.size();
int maxIndex = 0;
for(int i=0;i<size;i++) {
if(height[i] > height[maxIndex]) maxIndex = i;
}
int area = 0;
int maxLeft = 0;
for(int i=0;i<maxIndex;i++) {
if(height[i] > maxLeft) maxLeft = height[i];
else area += maxLeft - height[i];
}
int maxRight = 0;
for(int i=size-1;i>=maxIndex;i--) {
if(height[i] > maxRight) maxRight = height[i];
else area += maxRight - height[i];
}
return area;
}
};思路二:
直接用两个指针分别往中间移动,每次维持次高的水位secHeight。
java code:
public class Solution {
public int trap(int[] height) {
int len = height.length;
int left = 0, right = len - 1;
int secHeight = 0;
int area = 0;
while(left <right) {
if(height[left] < height[right]) {
secHeight = Math.max(secHeight, height[left]);
area += secHeight - height[left];
left++;
} else {
secHeight = Math.max(secHeight, height[right]);
area += secHeight - height[right];
right--;
}
}
return area;
}
}标签:
原文地址:http://blog.csdn.net/itismelzp/article/details/51636695