您的位置:首页 > 大数据 > 人工智能

leetcode -- Container With Most Water -- 经典题目重要!

2015-12-11 21:07 507 查看
https://leetcode.com/problems/container-with-most-water/

思路很重要。常考题目。

时间复杂度O(n),两个指针i, j分别从前后向中间移动,两个指针分别表示容器的左右边界。每次迭代用当前的容量更新最大容量,然后把高度小的边界对应的指针往中间移动一位。 我们的目的是找到比i = 0, j = len(height) - 1, 围成的area更大的矩形。因为是i,j向中间移动,所以这条边长度是在减小,最短的那条边如果继续减小,那么肯定不是最大值,除非最短的边增大。。。并且较长的边向前移动也肯定不会使得面积增大, 例如j往左移动一步,得到的新的height[j]比原来的大不会使得面积增大,因为最短的height[i]没变,如果得到的新的height[j]比原来的小,那么面积可能相等或者变小,肯定不会变大

注意原理:ref里面有正确性证明

参考:

http://www.cnblogs.com/tenosdoit/p/3812880.html

my code:

class Solution(object):
def maxArea(self, height):
"""
:type height: List[int]
:rtype: int
"""
i, j = 0, len(height) - 1
res = 0
while i < j:#肯定是小于,没有等于,因为i == j的话,(j-i)==0

area = min(height[i], height[j]) * (j - i)
res = max(res, area)
if height[i] < height[j]:#这里也可以是<=,如果height[i] == height[j],移动i或者j都可以
i += 1
else:
j -= 1
return res
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: