面试金典--面试题 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
相关推荐
Lee川8 小时前
优雅进化的JavaScript:从ES6+新特性看现代前端开发范式
javascript·面试
Lee川12 小时前
从异步迷雾到优雅流程:JavaScript异步编程与内存管理的现代化之旅
javascript·面试
晴殇i14 小时前
揭秘JavaScript中那些“不冒泡”的DOM事件
前端·javascript·面试
绝无仅有14 小时前
Redis过期删除与内存淘汰策略详解
后端·面试·架构
绝无仅有14 小时前
Redis大Key问题排查与解决方案全解析
后端·面试·架构
AAA梅狸猫15 小时前
Looper.loop() 循环机制
面试
AAA梅狸猫15 小时前
Handler基本概念
面试
Wect16 小时前
浏览器缓存机制
前端·面试·浏览器
掘金安东尼16 小时前
Fun with TypeScript Generics:玩转 TS 泛型
前端·javascript·面试
掘金安东尼16 小时前
Next.js 企业级落地
前端·javascript·面试