容器盛水(Python)
容器盛水问题
http://www.nowcoder.com/questionTerminal/31c1aed01b394f0b8b7734de0324e00f
关于 题目
如此言简意赅的说明,看不懂题正常,他压根就是给有经验的人看的,题目同 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)