leetcode 【 Container With Most Water 】python 实现

题目

Given n non-negative integers a1a2, ..., an, where each represents a point at coordinate (iai). n vertical lines are drawn such that the two endpoints of line i is at (iai) and (i, 0). Find two lines, which together with x-axis forms a container, such that the container contains the most water.

Note: You may not slant the container.

 

代码:oj测试通过 Runtime: 132 ms

 1 class Solution:
 2     # @return an integer
 3     def maxArea(self, height):
 4         # none case or one element case
 5         if height is None or len(height)<2:
 6             return 0
 7         # left point and right point
 8         left = 0
 9         right = len(height)-1
10         max_container = 0
11         while left<right :
12             curr_container = min(height[left],height[right]) * (right-left)
13             max_container = max(curr_container,max_container)
14             if height[left]>height[right]:
15                 right = right-1
16             else:
17                 left = left+1
18         return max_container

 

思路

数组前后双指针技巧。

有点儿像动态规划。

两个指针一左一右left right

面积为:min(height[left],height[right])*(right-left)

指针迭代条件为:哪边的指针所指位置的高度小,就从哪边往中间移动。每一步更新一次max_container的值。

为什么哪边的指针所指的位置高度小就从哪边往中间移动呢?能装多少水是有较短的那边决定的,因此如果寻求装更多的水,则应该优先从较短的一侧开始求变。

这样一来,每一次迭代后,都保证max_container保存了当前以及之前的可能最大蓄水量。

posted on 2015-01-31 20:36  承续缘  阅读(166)  评论(0编辑  收藏  举报

导航