[盛最多水的容器]
思路分析
使用 双指针法 解决了 “盛最多水的容器” 问题,目标是找到两条垂直线,使得它们与 x 轴构成的容器能容纳最多的水。
1. 初始化
int max = 0; // 记录当前最大容量
int left = 0; // 左指针(起始位置)
int right = n - 1; // 右指针(末尾位置)
- 变量作用:
max
:动态更新最大容量。left
和right
:分别从数组的两端向中间移动。
2. 双指针移动逻辑
while (left < right) {// 计算当前容量并更新最大值if (min(height[left], height[right]) * (right - left) > max) {max = min(height[left], height[right]) * (right - left);}// 移动指针if (height[left] < height[right]) {left++;} else {right--;}
}
- 容量计算:
- 当前容量 =
min(height[left], height[right]) * (right - left)
。- 高度由较短的一边决定(木桶效应)。
- 宽度为
right - left
。
- 当前容量 =
- 指针移动规则:
- 谁短移动谁:
- 如果
height[left] < height[right]
,则left++
(试图找到更高的左边界)。 - 否则
right--
(试图找到更高的右边界)。
- 如果
- 谁短移动谁:
class Solution {
public:int maxArea(vector<int>& height) {int max=0;int n=height.size();int left=0;int right=n-1;while(left<right){if(min(height[left],height[right])*(right-left)>max){max=min(height[left],height[right])*(right-left);}if(height[left]<height[right]){left++;}else{right--;}}return max;}
};