从两边往中间,贪心法
# 给你 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
# Related Topics 数组 双指针
# 👍 1923 👎 0
# 11.盛最多水的容器
# 看到这道题的第一时间感觉 用动态规划,定义一个输入数组长度的dp数组,然后每一次循环
# 比较是不是比前面的大。如果是就替换前面的,比到最后是最大的值
# leetcode submit region begin(Prohibit modification and deletion)
from typing import List
'''
第一次的思路:超时
class Solution:
def maxArea(self, height: List[int]) -> int:
dp = [0] * len(height)
dp[0] = 0
cur_max = 0
# print(dp)
for i in range(len(height)):
for j in range(i):
cur = (i - j) * min(height[j], height[i])
cur_max = cur if cur > cur_max else cur_max
dp[i] = max(cur_max, dp[i - 1])
return dp[-1]
'''
# leetcode submit region end(Prohibit modification and deletion)
class Solution:
def maxArea(self, height: List[int]) -> int:
# 正解: 从两端到中间计算,
# 用贪心法,每次移动最小的数字,因为如果移动大的,一定是减小的
cur_max, j, i = 0, len(height) - 1, 0
while i < j:
min_height = height[i] if height[i] < height[j] else height[j]
if height[i] < height[j]:
i += 1
else:
j -= 1
cur_max = max((j - i + 1) * min_height, cur_max)
return cur_max
if __name__ == '__main__':
sol = Solution()
print(sol.maxArea([1, 8, 6, 2, 5, 4, 8, 3, 7]))