1.自己的解法
class Solution {
public int trap(int[] height) {
if(height.length==0) return 0;
int left=0,right=height.length-1,count=0,maxl=height[0],maxr=height[height.length-1];
while(left<right){
if(height[left]<=height[right]){
if(height[left+1]<maxl) count+=maxl-height[left+1];
maxl=Math.max(maxl,height[left+1]);
left++;
}else{
if(height[right-1]<maxr) count+=maxr-height[right-1];
maxr=Math.max(maxr,height[right-1]);
right--;
}
}
return count;
}
}
我是紧接着 11 盛最多水的容器 后面做的这个题,所以就延续那个感觉从while(left<right)入的手
我才开始有想过要不要用递归,把每一段每一段的用函数计算出来,这个每一段指一个倒三角区域,只有这个V形才能盛水
后来觉得太麻烦了,不知道边界问题会不会很麻烦
现在这个做法的几个变量,count:就是指盛水的多少,maxl、maxr是指在遍历过程中遇到的左边和右边的最高值
1.比较左边的高度和右边的高度,哪边低就往中间靠拢
(比如:2,1,3,如果先更新高的一边,就会在1的地方以为可以盛2的水)
2.看要递增/递减的方向的下一个是否比最高点maxl/maxr低,低多少就在这个位置能盛多少水
3.比较一下,看是否更新max
这个过程跟着题上的例子走一遍,就比较有感觉,我向来不太会写题解,有点表达不清楚