面试金典--面试题 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
相关推荐
梦想的颜色5 分钟前
2026 AI Agent 工程师完整技术图谱|从面试题「什么是本体 Ontology」切入,附精选面试题库
面试·知识图谱·langgraph·aiagent·大模型面试·本体·2026 面试真题
不简说41 分钟前
JS 代码技巧 vol.10 — 20 个 V8 引擎原理,解释"为什么这样写快"
前端·javascript·面试
A富得流油的咸鸭蛋2 小时前
安卓鸿蒙面试
android·面试·harmonyos
swipe2 小时前
13|(前端转全栈)支付成功不等于结束:回调、幂等、超时关单和状态竞争
前端·后端·面试
thesky1234563 小时前
智能体面试准备(六):Agent 记忆系统设计——短期、长期与向量记忆的架构与实现
人工智能·面试·agent·智能体·记忆系统
swipe3 小时前
12|(前端转全栈)点击提交订单后,后端如何用事务守住价格、库存和订单?
前端·后端·面试
小园子的小菜3 小时前
Java 并发四大工具类深度解析:CountDownLatch、CyclicBarrier、Semaphore、Exchanger 原理、源码与面试考点
java·开发语言·面试
KaifuZeng4 小时前
BUCK电路面试相关笔记
笔记·嵌入式硬件·面试
会编程的土豆4 小时前
LeetCode 热题 HOT100(一):哈希表与双指针入门(Go 实现)
算法·leetcode·职场和发展
一水14 小时前
JVM 面试宝典:从入门到调优实战
jvm·面试