面试金典--面试题 17.21. 直方图的水量(不困难的困难题)

文章目录

题目描述

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

思路分析

观察图片可知,总面积=黑色面积+蓝色面积。

黑色面积很好求,直接sum(所给数组)就行了。

蓝色面积是答案。所以问题转化成求图中的总面积。

这个其实也很好处理,我们一层一层的去求就好了。

按照所给示例:height=0,1,0,2,1,0,1,3,2,1,2,1
第一层:

left=0,right=11,high=1 (high代表当前层数)。当左右指针指向的区域高度小于high时,左右指针都向中间移动,直到指针指向区域大于等于high的值。若不小于high,则指针不移动。

left不断向右靠近,在第一层left=1时,left和right在输入数组height中的数值都大于当前遍历的层数high。所以第一层的体积就是right-left+1

第二层:

第二层,high = 2,left一直向右移动到left = 3,right向左移动到right = 10。所以第二层体积:right - left + 1 = 8。

第三层同理为1。

所以最后的答案就是,刚求得的总体积-所给数组的和。

完整代码

python 复制代码
class Solution:
    def trap(self, height: List[int]) -> int:
        if not height:
            return 0
        zhuzi = sum(height)
        length = 1 # 表示第几层
        res = 0
        while length<=max(height):
            left = 0
            right = len(height)-1
            while height[left]<length:
                left+=1
            while height[right]<length:
                right-=1
            res += right-left+1
            length+=1
        return res-zhuzi
相关推荐
weedsfly34 分钟前
单例模式在前端中的正确打开方式
前端·javascript·面试
帅次1 小时前
Android 高级工程师面试:网络与数据层 近1年高频追问 18 题
android·网络·okhttp·面试·retrofit·gilde
Frostnova丶1 小时前
(13)LeetCode 53. 最大子数组和
算法·leetcode·职场和发展
tkevinjd12 小时前
力扣437路径总和III
算法·leetcode·面试·职场和发展
奔跑的蜗牛ing15 小时前
CentOS Nginx 安装与静态文件服务器配置指南
前端·面试·架构
KaifuZeng18 小时前
通信与接口协议面试五、RS422
嵌入式硬件·面试·通信与接口
Frostnova丶19 小时前
(12)LeetCode 76. 最小覆盖子串
算法·leetcode·职场和发展
旧曲重听119 小时前
为什么现在 RAG 越少越少提及了
数据库·程序人生·职场和发展·agent
SamDeepThinking20 小时前
组合还是继承?我在项目里主要看这两个判断
java·后端·面试
wear工程师20 小时前
setState 到底是不是异步的?这题从 React 16 问到 18,标准答案早就变了
react.js·面试