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      
相关推荐
I_LPL6 小时前
hot100贪心专题
数据结构·算法·leetcode·贪心
颜酱6 小时前
DFS 岛屿系列题全解析
javascript·后端·算法
WolfGang0073217 小时前
代码随想录算法训练营 Day16 | 二叉树 part06
算法
2401_831824968 小时前
代码性能剖析工具
开发语言·c++·算法
Sunshine for you9 小时前
C++中的职责链模式实战
开发语言·c++·算法
qq_416018729 小时前
C++中的状态模式
开发语言·c++·算法
2401_884563249 小时前
模板代码生成工具
开发语言·c++·算法
2401_831920749 小时前
C++代码国际化支持
开发语言·c++·算法
m0_6727033110 小时前
上机练习第51天
数据结构·c++·算法
ArturiaZ10 小时前
【day60】
算法·深度优先·图论