题目原文:
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.
题目大意:
给出n个非负整数数组,其中height[i]代表坐标轴上横坐标为[i,i+1]的矩形的高度,计算这些矩形和x轴围成的“容器”能装多少水。
题目分析:
本题是Middle-题目31的变形,也是用两个指针i和j分别指向数组头和结尾,记两边矩形的高度分别为height[i]和height[j],分两种情况讨论:
(1) height[i]<height[j]
,则i向右移动,如果后面矩形的高度小于height[i],则其高度差值一定可以装水(因为j那边比i高,不管中间是什么情况,j那侧一定不是“短板”,如果后面矩形的高度大于Height[i],则停止滑动i,因为已经找到一个“杯子”并计算出它的水量了。
(2) height[i]>height[j]
,同理j向左移动,找到一个高度大于等于height[j]的矩形,并记录差值(可以装水)。
等于的情况放到任何一种里面都可以,因为等于的时候装水量为0,最终到I,j相遇时循环停止。整个数组只扫描了一遍。
源码:(language:java)
public class Solution {
public int trap(int[] height) {
int res=0;
int l=0;
int r=height.length-1;
while(l<r){
int temp=Math.min(height[l],height[r]);
if(temp==height[l]){
l++;
while(l<r&&height[l]<=temp){
res+=temp-height[l];
l++;
}
}
else{
r--;
while(l<r&&height[r]<=temp){
res+=temp-height[r];
r--;
}
}
}
return res;
}
}
成绩:
1ms,beats 87.85%,众数2ms,71.18%
Cmershen的碎碎念:
也没什么要注意的,认真理解了上一题之后本题变化也不是很大。关键是注意“寻找杯子”的过程。