LeetCode42. 接雨水(第二篇)
上一篇博客,是按照行,层层向上,计算。我觉得没什么问题,但是没通过。因为用例太长还没能在本地自测
- 这个的思路是当前列能存储多少水
当前列存储能存储多少水取决于:左边最高柱子,和右边最高的柱子,以及自己的底部
可以想象,当柱子数组长度小于3(height.length<=2
),无法装水,直接返回0
能装多少水,取决一左右最高峰最短的,较矮的那个int temp = Math.min(leftHigh,rightHigh) - height[i];
,减去底部,就是装水的容量。(如果是负或者0代表无法装水)
好了现在思路就很清楚了,我们只需要知道三个数据,左边最高峰leftHigh
,右边最高峰rightHigh
,当前底部height[i]
就能求出当前列能装多少水
把所有的的当前列(height[1],到倒数第二列)求和,就得出一共的容量
执行结果:通过
执行用时 :130 ms, 在所有 Java 提交中击败了5.06% 的用户
内存消耗 :39.9 MB, 在所有 Java 提交中击败了11.78% 的用户
可以看出我的算法,效率不高,但是:要啥自行车!要啥手表
先填饱肚子再说吧
- 代码如下:
class Solution {
public int trap(int[] height) {
//长度为小于2直接返回
if (height.length<=2)
return 0;
//来自题解的思路 按列求
//左边最高的墙
int leftHigh = 0;
//右边最高的墙
int rightHigh = 0;
//水容量
int waterSum = 0;
for (int i = 1; i<height.length-1; i++){
leftHigh = maxHigh(height,0,i);
rightHigh = maxHigh(height,i+1,height.length);
//能装多少水取决于最短的板 再减去底部
int temp = Math.min(leftHigh,rightHigh) - height[i];
if (temp>0){
waterSum += temp;
}
}
return waterSum;
}
//找出该区间最大的值
int maxHigh(int[] height, int left,int right){
int temp=0;
for (int i=left;i<right;i++){
if (temp<height[i]) temp=height[i];
}
return temp;
}
}