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      
相关推荐
To_OC23 分钟前
LC 239 滑动窗口最大值:从暴力超时到单调队列一遍过
javascript·算法·leetcode
.道阻且长.1 小时前
9.LeetCode算法习题讲解--滑动窗口--无重复字符的最长字串
算法·leetcode·职场和发展·哈希算法
ltl3 小时前
HNSW:图索引如何击败树索引
算法
嗯哼python3 小时前
从 0 到 1 构建 AI 模拟面试系统:RAG + LangGraph 的工程实践
人工智能·面试·职场和发展
曹牧4 小时前
C#:数字的定义和表示方式
算法·c#
Nil2085 小时前
leetcode 138随机链表的复制
算法·leetcode·链表
疯狂打码的少年6 小时前
【数据结构】图的遍历:深度优先搜索(DFS)
数据结构·笔记·算法·深度优先
-凌凌漆-7 小时前
【freertos】Task创建(v2)
java·开发语言·算法
Nil2088 小时前
leetcode 24两两交换链表中的节点
算法·leetcode·链表