【题目】
Given n non-negative integers a1, a2, ..., an , where each represents a point at coordinate (i, ai). n vertical lines are drawn such that the two endpoints of line i is at (i, ai) and (i, 0). Find two lines, which together with x-axis forms a container, such that the container contains the most water.
【注意】
You may not slant the container and n is at least 2.
The above vertical lines are represented by array [1,8,6,2,5,4,8,3,7]. In this case, the max area of water (blue section) the container can contain is 49.
【举例】
Example:
Input: [1,8,6,2,5,4,8,3,7]
Output: 49
【题目翻译】
给定一个数组nums, 把该数组的每个元素映射到直方图上, 比如该数组的元素nums[i], i 就是横坐标, nums[i]就是纵坐标。
然后判断哪两个矩形之间能盛的水的最多, 返回该面积。
【解题思路】
我们用双指针来解决该问题, lo = 0, hi = len(nums)-1
计算这两个矩形产生的面积, 然后把高度较低的矩形去掉(该例lo += 1), 因为它不可能产生比当前面积更大的面积了。
然后再计算新的两个矩形产生的面积, 和最大面积比较更新最大面积, 然后再把较低的矩形去掉。。。
【实现代码】
class Solution:
def maxArea(self, height):
"""
:type height: List[int]
:rtype: int
"""
lo = 0
hi = len(height) - 1
max_ = 0
while lo < hi:
max_ = ((hi-lo)*min(height[lo], height[hi]), max_) #更新最大面积
#去掉高度较低的矩形
if height[lo] < height[hi]:
lo += 1
else:
hi -= 1
return max_