Leetcode11. 盛最多水的容器
创始人
2024-05-26 14:03:35

一、题目描述:

给定一个长度为 nnn 的整数数组 heightheightheight 。有 nnn 条垂线,第 iii 条线的两个端点是 (i,0)(i, 0)(i,0) 和 (i,height[i])(i, height[i])(i,height[i]) 。

找出其中的两条线,使得它们与 xxx 轴共同构成的容器可以容纳最多的水。

返回容器可以储存的最大水量。

说明:你不能倾斜容器。

  1. 示例 1:

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

  2. 示例 2:

    输入:height = [1,1]
    输出:1

  • 提示:
    • n == height.length
    • 2 <= n <= 105
    • 0 <= height[i] <= 104

二、解决思路和代码

  1. 解决思路(双指针法)

    • 分析:假如容水量=宽度(w)×高度(h),要使得容水量最大,需要宽度尽可能大,高度尽可能大。
    • 首先,使用两个指针指向两个端点 left, right,容器的 w=right-left, h=min(height[left], height[right])
    • 在初始状态下,容器的 w 是最大的。因此,通过移动 left 和 right 指针,找到较高的 h,可以使得容水量更大。
      • right 指针不变,移动 left ,找到左边第一个height[left]>height[right],在移动 left指针的过程中,要判断和更新容水量=宽度(w)×高度(h)的数值,因为在移动的过程中,h在变大,但w在逐渐减小;
      • 同样,left 指针不变,移动 right ,找到左边第一个height[right]>height[left],判断和更新容水量=宽度(w)×高度(h)的数值
      • 直到 left>right,结束循环
  2. 代码

    from typing import *
    class Solution:def maxArea(self, height: List[int]) -> int:res = 0left, right = 0, len(height)-1while left res:res = min(height[left], height[right])*(right-left)left += 1while left res:res = min(height[left], height[right])*(right-left)right -= 1return res
    

相关内容

热门资讯

“中国龙眼之乡”广东茂名龙眼采... 来源:中国新闻社“中国龙眼之乡”广东茂名龙眼采收结束 果农丰产增收中新网 广东茂名8月16日电 (梁...
SpaceX上市造富高校圈:哈... 近日,哈佛大学旗下投资管理机构哈佛管理公司(Harvard Management Company, ...
杨浦这家店,有哪些值得带回家的... (来源:上观新闻)在杨浦区三号湾广场二楼 有一家能让你足不出“沪” 就直达香格里拉的餐厅——哈达 这...
全球股市陆续熊去,下周A股能否... 来源:@每日经济新闻微博 【#全球股市陆续熊去#,下周A...
应急管理部从河南、陕西、江苏、... (来源:政事儿)转自:政事儿央视新闻8月16日消息,为协助做好河南周口市区排涝工作,应急管理部从河南...