💻 [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;
}
}
💡 复杂度分析
- 时间复杂度:O(n) → 只需遍历数组一次
- 空间复杂度:O(1) → 仅使用常数空间
🌟 总结要点
✅ 双指针核心作用:高效缩小搜索范围
✅ 贪心思想:每次移动高度较小的指针,确保不漏解
✅ 适用场景:区间问题、最大最小值问题
🔥 下期预告:《三数之和》双指针法的经典应用!