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 ,矩形高度仍然为heighti,底宽减小,最大水量比原来小
height[i] < K < height[j] ,矩形高度仍然为heighti,底宽减小,最大水量比原来小
K < height[i] < height[j] ,矩形高度变为K,底宽减小,最大水量比原来小

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

所以应该移动低的那一边

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      
相关推荐
GoAI3 小时前
DeepSeek Harness Memory (一)主流记忆插件总结
后端·算法·面试
Pniubi4 小时前
力扣54.螺旋矩阵
算法·leetcode·矩阵
choumou_M6 小时前
算法_1:由浅入深学习快速排序QuickSort
学习·算法·排序算法
Coder_Shenshen7 小时前
罗克韦尔ACD工程归档离线变量树解析
算法·c#
心仪久了会沦陷9 小时前
C语言数据结构入门——树与二叉树详解:概念、堆实现与链式遍历
c语言·数据结构·算法
小此方9 小时前
[算法实战论:动态规划]背包问题概念,01不满背包问题,01满背包问题,背包问题的滚动数组空间优化
算法·动态规划
悠仁さん10 小时前
【C++】哈希表
c++·算法·散列表
地平线开发者10 小时前
点云算法整理与常用计算模块:从数据到模型,再到工程与量化
算法·自动驾驶
武子康13 小时前
H3-World 为何在加载 LoRA 前,先检查导入的代码?
人工智能·深度学习·算法