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
    

相关内容

热门资讯

言短意长|“烹饪大师”退场,餐... 地方行业协会的“大师”清理仍在进行时。近日,四川泸州市餐饮行业协会、泸州市餐饮行业工会联合会发出一纸...
国家发展改革委向民营企业 公开... (来源:嘉兴日报)转自:嘉兴日报  新华社北京9月11日电(记者 魏玉坤)记者11日从国家发展改革委...
弓弦之上 热爱与梦想同箭齐发 (来源:嘉兴日报)转自:嘉兴日报  ■记者 龚思雨  拉弓、瞄准、放弦,箭矢破空而出,一声清脆的“b...
漫画的启示 (来源:南湖晚报)转自:南湖晚报   长安镇中心小学605班 潘奕桐 指导老师 杜盈  漫画虽然不会...
三友联众聘任44岁杜欣洋为核心... 9月12日,三友联众公告,聘任杜欣洋先生为公司核心技术人员。资料显示,杜欣洋先生,中国国籍,无境外永...