LeetCode-42.接雨水(考察點:我也不知道是什麼......)
阿新 • • 發佈:2019-01-28
給定 n 個非負整數表示每個寬度為 1 的柱子的高度圖,計算按此排列的柱子,下雨之後能接多少雨水。
上面是由陣列 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度圖,在這種情況下,可以接 6 個單位的雨水(藍色部分表示雨水)。 感謝 Marcos 貢獻此圖。
示例:
輸入: [0,1,0,2,1,0,1,3,2,1,2,1]
輸出: 6
解題思路:利用兩個輔助陣列left[]和right[]
left[i]、right[i]分別表示i位置左邊所有數的最大值和i位置右邊所有數的最大值,
若height[i] < left[i] && height[i] < right[i],則i位置積水,且積水量為min(left[i], right[i]) - height[i]
java程式碼:
class Solution { public int trap(int[] height) { int len = height.length; int[] left = new int[len], right = new int[len]; for(int i = 1; i < len; i++) left[i] = Math.max(left[i-1], height[i-1]); for(int i = len - 2; i >= 0; i--) right[i] = Math.max(right[i+1], height[i+1]); int result = 0; for(int i = 0; i < len; i++){ if(height[i] > left[i] || height[i] > right[i]) continue; result += Math.min(left[i], right[i]) - height[i]; } return result; } }
個人的一點想法:其實沒太弄明白這道演算法題的核心點在哪,這種解法給我的感覺有點像高等數學裡面的微積分,求導數的時候用的思路,但是又不完全一樣,剛剛看了一下這道題的相關話題是棧、陣列、雙指標,用棧應該也可以解,但是目前還沒想到用棧的解法,後續如果想到了解法會再更新。
參考文章:https://blog.csdn.net/Bendaai/article/details/80116069