【LeetCode每日一題】直方圖的水量

直方圖的水量

一、題目描述

給定一個直方圖(也稱柱狀圖),假設有人從上面源源不斷地倒水,最後直方圖能存多少水量?直方圖的寬度爲 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;
    }
}
相關文章
相關標籤/搜索