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.
翻译后:
给定n个非负整数来表示每个柱的宽度为1的高程图,计算下雨后它能够捕集多少水。
解释:
首先看到题后(翻译后的。。。。),我最想知道的就是:高程图是什么?
高程图:用来表示某一区域海拨高低(即高程)的图纸。。。。百度百科中只有这一句解释,大致知道了题目是什么意思,就是说这n个非负数代表高度,当下雨的时候可以有多少的积水。但是理解是理解了,并不是非常的形象,还不知道什么情况可以有积水,幸好还有一个事例。
事例:
例如,
给定[0,1,0,2,1,0,1,3,2,1,2,1]
,返回6
。
这下就直观多了,就是高度为数值,能积水多少就是看两个高度之间最低的了,有点像木桶原理。第一个和最后一个无论是多少,都无法积水,因为边上是空着的,所以主要还是从数组的[1]和[length()-2]来判断。、
思路:
我的想法是先找到最高的地方,也就是最大值,然后找出去它后的最大值,然后计算中间的面积,再减去中间包含的高度面积,最后知道找到最低的,把算出来的面积都相加起来,就是积水数量。但是按照我的思路,在实现的时候还是存在很多我无法解决的问题。而且需要进行很多次的判断,效率上非常低效,所以我还是学习了大神的代码:
public int trap(int[] A){
int a=0;
int b=A.length-1;
int max=0;
int leftmax=0;
int rightmax=0;
while(a<=b){
leftmax=Math.max(leftmax,A[a]);
rightmax=Math.max(rightmax,A[b]);
if(leftmax<rightmax){
max+=(leftmax-A[a]); // leftmax is smaller than rightmax, so the (leftmax-A[a]) water can be stored
a++;
}
else{
max+=(rightmax-A[b]);
b--;
}
}
return max;
}
虽然有了答案,但是很多还是没有想明白,现在在这里我就不进行讲解了,明天会好好思考,附上详细的解释。
每天更新一道题,不是因为我懒,只做一道题,而是因为我现在还是个小白,现在在做一道题的时候我还需要去学习一些相关的知识,而且每天白天在实习上班,最近也比较忙,晚上回来还需要写毕业设计和论文,但是我还是会坚持学习更新博客的,天天这样真的感觉非常的充实,而且进步非常明显,所以我会继续努力,我相信有一天我可以做算法题做的得心应手的。