Python刷leetcode--11.盛最多水的容器

从两边往中间,贪心法

# 给你 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]))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值