leetcode 热题100(11. 盛最多水的容器)

一、题目

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

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

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

说明:你不能倾斜容器。

示例 1:

输入:1,8,6,2,5,4,8,3,7

输出:49

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

示例 2:

输入:height = 1,1

输出:1

二、分析

其实就是求取最大面积,这道题我打算用双指针往中间走试试

三、解题

python 复制代码
class Solution:
    def maxArea(self, height: list[int]) -> int:
        li = []
        j = len(height) - 1
        i = 0
        while j >= 1:
            if height[i] < height[j]:
                area = height[i] * (j-i)
                li.append(area)
                i += 1
            else:
                area = height[j] * (j-i)
                li.append(area)
                j -= 1
        return max(li)

四、代码优化

1、while条件

实际上我上述代码的条件是有问题的,两边往中间走的话,这两个指针一定会在中间集合,所以实际上i永远小于j,等 i >= j 的时候,两个指针就朝相反方向走了,所以while的条件一定是i < j

2、只关心最大值,没必要用 list 存所有面积

我的if else其实是在判断左边小还是右边小,所以其实可以这么写:

python 复制代码
area = min(height[left], height[right]) * (right - left)
max_area = max(max_area, area)

这两句还可以合成一句:

python 复制代码
max_area = max(max_area, min(height[left], height[right]) * (right - left))

就是可读性略低

3、最终优化代码

python 复制代码
class Solution:
    def maxArea(self, height: list[int]) -> int:
        left, right = 0, len(height) - 1
        max_area = 0
        while left < right:
            max_area = max(max_area, min(height[left], height[right]) * (right - left))
            if height[left] < height[right]:
                left += 1
            else:
                right -= 1
        return max_area
相关推荐
BK贝壳4 小时前
亿级用户签到位图选型复盘:用 bool-hybrid-array 扛冷启动打卡,也把它和 Roaring/Redis 的边界测清楚了
数据结构·python·性能优化·numpy
2601_966949656 小时前
如何根据研究的起止时间截取分钟级行情?Python 实战与 QuantDash 数据处理指南
开发语言·python·pandas·量化交易·1024程序员节·股票数据·quantdash
拓恒技术7 小时前
无人机巡检AI算法的工程化落地:从需求到交付的5个核心环节
人工智能·算法·无人机
晨曦中的暮雨8 小时前
限流算法——固定窗口、滑动窗口、漏桶、令牌桶
java·开发语言·算法
怕浪猫8 小时前
Claude Code vs Codex:Computer Use 实现原理深度拆解
算法·面试·github
文丑颜不良啊9 小时前
LeetCode876~900题目解析
java·leetcode
罗西的思考10 小时前
AI 时代的 “房谋杜断”:如何培养能力、品味与判断力
人工智能·算法·机器学习
淡海水10 小时前
07-02-源码-.NET Core GC分配路径
算法·unity·c#·.netcore·gc·1024程序员节
在世修行10 小时前
智学文枢:页面切换与跨页数据预填
python·桌面应用·signal·1024程序员节·pyside·跨页跳转·状态预填
2601_9628857210 小时前
如何用 Python 把 K 线重采样成任意周期?
开发语言·python