[LeetCode Hot100] 盛最多水的容器双指针法,Java实现!图文详解,小白也能秒懂!
✏️本文对应题目链接:盛最多水的容器
给定一个长度为 n
的整数数组 height
,其中 height[i]
表示第 i
条垂直线的高度。找出其中的两条线,使得它们与 x
轴共同构成的容器可以容纳最多的水。
示例:
输入:height = [1, 8, 6, 2, 5, 4, 8, 3, 7]
输出:49
解释:选择第2条线(高度8)和第9条线(高度7),容器宽度为7,容量为 min(8, 7) * 7 = 49。
如何在O(n)时间复杂度内找到最大容量的容器?
关键步骤:
left
指针指向数组开头,right
指针指向数组末尾right - left
)动态过程图解:
初始状态:[1, 8, 6, 2, 5, 4, 8, 3, 7]
- left=0, right=8 → 容量=min(1,7)*8=8
- 移动left(高度较小)→ left=1
- left=1, right=8 → 容量=min(8,7)*7=49
- 移动right(高度较小)→ right=7
- left=1, right=7 → 容量=min(8,3)*6=18
- 移动right(高度较小)→ right=6
- left=1, right=6 → 容量=min(8,8)*5=40
- 移动left或right均可 → 结束
class Solution {
public int maxArea(int[] height) {
int left = 0; // 左指针
int right = height.length - 1; // 右指针
int maxArea = 0; // 记录最大容量
// 双指针遍历
while (left < right) {
// 计算当前容量
int currentArea = Math.min(height[left], height[right]) * (right - left);
// 更新最大容量
maxArea = Math.max(maxArea, currentArea);
// 移动高度较小的指针
if (height[left] < height[right]) {
left++;
} else {
right--;
}
}
return maxArea;
}
}
✅ 双指针核心作用:高效缩小搜索范围
✅ 贪心思想:每次移动高度较小的指针,确保不漏解
✅ 适用场景:区间问题、最大最小值问题
下期预告:《三数之和》双指针法的经典应用!