leetcode hot100 11.盛最多水的容器 medium 双指针

暴力 O(n²)

超时

python 复制代码
class Solution:
    def maxArea(self, height: List[int]) -> int:

        maxwater = 0
        for i in range(len(height)):
            for j in range (i, len(height)):
                area = (j-i) * min(height[i], height[j])
                maxwater = max(maxwater,area)

        return maxwater      
        

丢掉短板

保留长板

首尾双指针 left, right = 0, len(height) - 1

两边指针向里收缩,当 left ≥ right,停止

面积 = 底× 高,收缩过程中,底在减小,只有高会变化:

min(height[i], height[j])

假设现在 height[i] < height[j]
min(height[i], height[j]) = height[i]

假设下一根柱子的高度K,

如果移动高的那一边,矮高被保留
height[i] < height[j] < K ,矩形高度仍然为height[i],底宽减小,最大水量比原来小
height[i] < K < height[j] ,矩形高度仍然为height[i],底宽减小,最大水量比原来小
K < height[i] < height[j] ,矩形高度变为K,底宽减小,最大水量比原来小

如果移动低的那一边,矮高被丢弃
height[i] < height[j] < K , 矮高已被丢弃,矩形高度变为height[j] , height[j] > 原来的height[i] ,底宽减小,最大水量有机会变大
height[i] < K < height[j] ,矮高已被丢弃,矩形高度变为K ,K > 原来的height[i] ,底宽减小,最大水量有机会变大
K < height[i] < height[j] ,矮高已被丢弃,矩形高度变为K ,K < 原来的height[i] ,底宽减小,最最大水量比原来小

所以应该移动低的那一边

python 复制代码
class Solution:
    def maxArea(self, height: List[int]) -> int:

        maxwater = 0
        i =0 
        j = len(height)-1
        while i<j:
            area = (j-i) * min(height[i], height[j])
            maxwater = max(maxwater,area)

            if height[i] < height[j]:
                i+=1
            else:
                j-=1


        return maxwater      
相关推荐
多加点辣也没关系19 小时前
数据结构与算法|第十五章:排序算法(下)— 非比较类排序
算法·排序算法
guo_xiao_xiao_19 小时前
YOLOv11城市道路自行车目标检测数据集-552张-bicycle-1_5
算法·yolo·目标检测
君义_noip20 小时前
CSP-J 2025 入门级 第一轮(初赛) 完善程序(1)
c++·算法·信息学奥赛·csp 第一轮
WL_Aurora20 小时前
备战蓝桥杯国赛【Day 6】
python·算法·蓝桥杯
绛橘色的日落(。・∀・)ノ20 小时前
机器学习 逻辑回归
算法·机器学习·逻辑回归
测绘第一深情20 小时前
在vscode中使用codex教程(个人安装经验)
数据结构·ide·vscode·python·算法·计算机视觉·编辑器
Liangwei Lin20 小时前
LeetCode 41. 缺失的第一个正数
数据结构·算法·leetcode
海参崴-20 小时前
手写红黑树全流程学习总结
学习·算法
名字不好奇20 小时前
大模型如何“理解“人类语言:从符号到语义的飞跃
算法
小雅痞20 小时前
[Java][Leetcode hard] 76. 最小覆盖子串
java·算法·leetcode