42. 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.
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!
解决思路
对长条的高度进行排序,首先找出一条最高的,然后分别左右两找出小于等于这这个高度的位置然后进行面积计算
public class Solution {
public int trap(int[] height) {
if(height.length<=1){
return 0;
}
Point[] point = new Point[height.length];
for (int i = 0; i < height.length; i++) {
point[i] = new Point();
point[i].cordin = i;
point[i].height = height[i];
}
Arrays.sort(point);
int ans = 0;
int left = point[0].cordin;
int right = point[0].cordin;
int i = 1;
while (left > 0 && i < point.length) {
while (i < point.length && point[i].cordin >= left) i++;
for (int j = point[i].cordin + 1; j < left; j++) {
ans += point[i].height - height[j];
}
left = point[i].cordin;
}
i = 1;
while (right < height.length - 1 && i < point.length) {
while (i < point.length && point[i].cordin <= right) i++;
for (int j = right + 1; j < point[i].cordin; j++) {
ans += point[i].height - height[j];
}
right = point[i].cordin;
}
return ans;
}
class Point implements Comparable<Point> {
public int height;
public int cordin;
public int compareTo(Point o) {
if (height != o.height) {
return o.height - height;
}
return cordin - o.cordin;
}
}
}