LeetCode11——盛最多水的容器

题目:

给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

说明:你不能倾斜容器,且 n 的值至少为 2。

 

图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。

示例:

输入: [1,8,6,2,5,4,8,3,7]
输出: 49

方法一:暴力解法

简而言之,就是求出所有的面积,在找出最大值,思路简单,就不做分析,直接上代码:

def max_area(height: list) -> int:
    if len(height) == 0:
        return 0
    if len(height) == 1:
        return height[0]
    ret = []
    interval = len(height) - 1
    i = 0
    while i < len(height) and interval > 0:
        j = min(height[i], height[i + interval])
        ret.append(interval * j)
        i += 1
        if i + interval > len(height) - 1:
            i = 0
            interval -= 1

    return max(ret)

方法二:双指针法

暴力法虽然简单,但是时间复杂度太高,速度太慢,所以能不能找一个更快的方法呢?

因此,可以定义两个指针,一个指向列表起点,一个指向列表最后,计算面积,在计算面积之前需要判断两个指针指向元素的大小,并且从小的那一方先向前遍历。

代码如下:

def max_area(height: list) -> int:
    left = 0
    right = len(height) - 1
    maxArea = 0
    while left < right:
        b = right - left
        if height[left] < height[right]:
            h = height[left]
            left += 1
        else:
            h = height[right]
            right -= 1
        area = h * b
        if area > maxArea:
            maxArea = area
    return maxArea
posted @ 2020-01-09 10:26  叶聪  阅读(33)  评论(0)    收藏  举报