【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;
    }
}
相关文章
相关标签/搜索