[LintCode 383] 装最多水的容器(Python)

题目描述

给定 n 个非负整数 a1, a2, …, an, 每个数代表了坐标中的一个点 (i, ai)。画 n 条垂直线,使得 i 垂直线的两个端点分别为(i, ai)和(i, 0)。找到两条线,使得其与 x 轴共同构成一个容器,以容纳最多水。
注意事项
容器不可倾斜。
样例
给出[1,3,2], 最大的储水面积是2.

思路

两侧不断向一起逼近。每次计算面积为横坐标之差乘以纵坐标较小的数值,并更新最大值。若纵坐标较小的数值在左边,则向右移一位;若纵坐标较小的数值在右边,则向左移一位;直至重合。

代码

class Solution:
    """
    @param: heights: a vector of integers
    @return: an integer
    """
    def maxArea(self, heights):
        # write your code here
        if heights is None or len(heights) <= 1:
            return 0
        s = 0
        e = len(heights) - 1
        res = 0
        while s < e:
            area = 0
            area = min(heights[s], heights[e]) * (e - s)
            if heights[s] <= heights[e]:
                s += 1
            else:
                e -= 1
            res = max(area, res)
        return res

复杂度分析

时间复杂度 O(n) ,空间复杂度 O(1)

你可能感兴趣的:(算法)