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;
}
}