Leecode刷题: 11. 盛最多水的容器

  1. 盛最多水的容器
    给定 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

1

我的思路:
感觉暴力法肯定通不过,所以想这样,有一根线从底部,一格一格向上走,每向上走一格,就获取最大容量,直到走到最上端。
代码如下:

def maxArea(height):
    max = 0
    for i in sorted(set(height)):
        left = 0
        right = 0
        FOUND1 = False
        FOUND2 = False
        print('*' * 40)
        print('Current i: %s' % i)
        for j in range(len(height) - 1):
            if height[j] >= i:
                left = j
                FOUND1 = True
                break
        for j in range(-1, -len(height), -1):
            if height[j] >= i:
                right = len(height) + j
                FOUND2 = True
                break
        print(left, right)
        if right > left and FOUND1 and FOUND2:
            temp = (right - left) * i
            max = temp if temp > max else max
    return max

提交后,“ 超出时间限制”

2

参照官方思路:

class Solution:
    def maxArea(self, height: List[int]) -> int:
        max = 0
        i = 0
        j = len(height) - 1
        while i != j:
            if height[i] <= height[j]:
                temp = height[i] * (j - i)
                max = temp if temp > max else max
                i += 1
            else:
                temp = height[j] * (j - i)
                max = temp if temp > max else max
                j -= 1
        return max

问题在于,看到了人家的思路,感觉真厉害,可自己就是想不出。
不知道做得多了,会不会自己也变得厉害些。

猜你喜欢

转载自blog.csdn.net/weixin_43720396/article/details/88028688