給定一個直方圖(也稱柱狀圖),假設有人從上面源源不斷地倒水,最後直方圖能存多少水量?直方圖的寬度爲 1java
上面是由數組 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的直方圖,在這種狀況下,能夠接 6 個單位的水(藍色部分表示水)數組
輸入示例: 輸入: [0,1,0,2,1,0,1,3,2,1,2,1] 輸出: 6
思考: 一、只要左右兩邊牆比我自己高,那麼我就能夠注水成功,可是同時考慮邊狀況比較複雜 一、所以咱們先思考先知足一邊注水成功的狀況,只要一邊上的位置比我當前高,那麼我就能夠注水 二、所以咱們能夠獲得從左往右注水,和從左往右注水的狀況,只要取他們的交集就好了 解題方式: 一、先從左往開始遍歷,只要右邊的位置比左邊最高的低,咱們就給它注水,以下圖第一個圖所示 二、再從右往左遍歷,只要左邊的位置比右邊低,咱們仍是給它注水,以下圖第二個圖所示 三、從兩個遍歷的數組中,選取每一個位置最小值進行相加便可獲得咱們的最終結果。
下圖就是取交集後的結果code
package com.java; import java.util.Stack; public class Day02_Solution { public int trap(int[] height) { int[] leftMax = new int[height.length]; int[] rightMax = new int[height.length]; int sum=0; int max=0; for(int i=0;i<height.length;i++) { if (max < height[i]) { max = height[i]; } leftMax[i] = max - height[i]; } max = 0; for (int i=height.length-1;i>=0;i--) { if (max < height[i]) { max = height[i]; } rightMax[i] = max - height[i]; } for (int i=0;i<height.length;i++) { sum = sum + (rightMax[i] < leftMax[i] ? rightMax[i]:leftMax[i]); } return sum; } }