题目:Trapping Rain Water
难度:hard
问题描述:
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!
解题思路:
这道题立马让我想到了之前做过的一道求两条柱子间面积的题。此题使用了类似的方法。我们不用仔细地计算每个“容器的装水”容量、我们只需要计算装水前的容器面积和装满水后的容器面积之差即可。此题的难点是如何装满水成为一个新nums。在此我使用了从头和尾夹逼的方法,从低往高装水。装完一层形成新的数组再装下一层~
具体代码如下:
public class Solution {
public int trap(int[] height) {
int preS=0; //原面积
int aftS=0; //后面积
int pre=0;
int aft=height.length-1;
int temp;
for(int i=0;i<height.length;i++){
preS+=height[i];
}
while(pre<aft){
if(height[pre]<height[aft]){
temp=height[pre];
}else{
temp=height[aft];
}
for(int j=pre+1;j<aft;j++){
height[j]=Math.max(temp, height[j]);
}
if(height[pre]<height[aft]){
while(pre<aft&&height[pre]<=temp){
pre++;
}
}else{
while(aft>pre&&height[aft]<=temp){
aft--;
}
}
}
for(int i=0;i<height.length;i++){
aftS+=height[i];
}
return aftS-preS;
}
}