• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

黄文超

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

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

直方图的水量

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

posted on 2021-04-02 11:04  黄文超  阅读(217)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3