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
    

相关内容

热门资讯

佰达国际控股(01949.HK... 格隆汇1月13日丨佰达国际控股(01949.HK)公布,自2026年1月9日起,公司核数师之英文名称...
蒋超良两个弟弟蒋斌良、蒋忠良曝... 蒋超良被渗透式“围猎”,商人开口就要大项目由中央纪委国家监委宣传部与中央广播电视总台央视联合摄制的电...
花溪消防开展冬季入户宣传 筑牢... (来源:百姓关注)此次宣传的一个重点,是针对不少居民沿袭的冬季熏制腊肉、香肠的习俗。消防员们手持宣传...
华夏幸福2025年预亏超160... 财联社1月13日讯(记者 李洁)华夏幸福(600340.SH)正面临业绩巨亏与退市风险的双重考验。1...
“秒级”通关!邮轮入境游火爆 ... 来源:央视新闻客户端过去的一年,外国游客入境游持续火爆,其中也包括邮轮入境游。自外国旅游团邮轮入境免...