首页 > 其他 > 详细

【LeetCode每日一题】直方图的水量

时间:2021-04-02 14:44:52      阅读:11      评论:0      收藏:0      [点我收藏+]

直方图的水量

1、题目描述

给定一个直方图(也称柱状图),假设有人从上面源源不断地倒水,最后直方图能存多少水量?直方图的宽度为 1

技术分享图片

上面是由数组 [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

2、解题思想

思考:
  1、只要左右两边墙比我本身高,那么我就可以注水成功,但是同时考虑边情况比较复杂
  1、因此我们先思考先满足一边注水成功的情况,只要一边上的位置比我当前高,那么我就可以注水
  2、因此我们可以得到从左往右注水,和从左往右注水的情况,只要取他们的交集就行了
解题方式:
    1、先从左往开始遍历,只要右边的位置比左边最高的低,我们就给它注水,如下图第一个图所示
    2、再从右往左遍历,只要左边的位置比右边低,我们还是给它注水,如下图第二个图所示
    3、从两个遍历的数组中,选取每个位置最小值进行相加即可得到我们的最终结果。

技术分享图片

下图就是取交集后的结果

技术分享图片

3、代码实现

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

【LeetCode每日一题】直方图的水量

原文:https://www.cnblogs.com/huangwenchao0821/p/14609754.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!