关于 题目

如此言简意赅的说明,看不懂题正常,他压根就是给有经验的人看的,题目同 Leetcode题 接雨水

关于 Python

受不了,直接 return 都会超时,也怪不得人家榜上的直接处理输入。
说真的,作为一个 Pythoner 我感觉我受到了歧视,也不是一个两个题这样,牛客就是视若无睹。

题解

这里用宫水三叶大佬那里学来的 面积差法 ,区区 6 行,真的乱杀

详情可以点超链接,直接送达题解处,有图且详细。
这里讲下主要思想,其实就是从左从右各扫描一次,然后减去矩形框的面积和柱子面积就是水的面积。即:

ps:这左扫描可以想象成一束光从左边平行打过来,光照不到的即为扫描面积;右扫描同理。

#
# max water
# @param arr int整型一维数组 the array
# @return long长整型
#
class Solution:
    def maxWater(self , arr ):
        s = lmax = rmax = 0
        for i in range(len(arr)):
            if lmax < arr[i]: lmax = arr[i]
            if rmax < arr[len(arr) - 1 - i]: rmax = arr[len(arr) - 1 - i]  # 左右扫描同时进行,就很妙
            s += lmax + rmax - arr[i]  # 每次循环也顺带处理柱子面积
        return s - lmax * len(arr)