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
    

相关内容

热门资讯

【文化中国行】“圈”出幸福感!... (来源:工人日报) 阅读提示 近年来,嘉兴市总工会以全总“559”部署和省总工会“137...
特色养殖“驮”起增收梦 投喂黑驴。本报记者 栾雨嘉 摄本报记者 栾雨嘉12月12日,黄南藏族自治州尖扎县措周乡俄什加村的肉驴...
内蒙古粮食产量达840.7亿斤 (来源:内蒙古日报)转自:内蒙古日报本报12月13日讯  (记者  韩雪茹)据12月12日国家统计局...
北疆楷模黄启东先进事迹报告会举... (来源:内蒙古日报)转自:内蒙古日报本报呼和浩特12月13日讯  (记者  皇甫秀玲)12月11日,...
全球最大储能电站在巴彦淖尔投运 (来源:内蒙古日报)转自:内蒙古日报本报巴彦淖尔12月13日电  (记者  薄金凤)12月12日,内...