数组_leetcode11

# 首先,两条线条之间的容积为(x2 - x1) * min(height[x1],  height[x2])
# 先取最左边直线和最右边直线,这种情况用(0, n-1)表示。
# 下一步,考虑减少一个单位的宽度的情况,这时候有两种选择:(0, n-2)和(1, n-1)。
# 对比这两种情况,如果线条的高度height[0] < height[n-1],也就说是第0根线条是“短板”,
# 那么(0, n-2)的容积肯定会比(0, n-1)的容积小(前者容积为height[0]乘以宽度,
# 后者的“短板”肯定小于或等于height[0],而宽度变小),因此(0, n-2)的情况可以不用比较,
# 因此,下一步考虑(1, n-1)的情况,依次类推。时间复杂度为O(n)。

# 其实就是剪支策略

# 题解思路:
# 本质上是一个(a,b)的组合问题 : n2 复杂度
# 解空间树 的初值 (0,n), 初值搜索的关键
# 最值问题 在 解空间树上 可以进行剪支 这是一个重要的启示 : 20190302 找工作期间

class Solution(object):
def maxArea(self, height):
"""
:type height: List[int]
:rtype: int
"""
left = 0
right = len(height)-1
maxArea = -1
while left < right:
tempArea = (right -left) * min(height[left],height[right])
maxArea = max(maxArea,tempArea)

# 剪支
if height[left] < height[right]:
left += 1
else:
right -= 1

return maxArea
posted @ 2019-03-17 14:17  AceKo  阅读(177)  评论(0编辑  收藏  举报