
暴力 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