使用双指针技巧解决容器中水的最大容量问题
问题描述
给定一个长度为 n
的整数数组 height
。有 n
条垂线,第 i
条线的两个端点是 (i, 0)
和 (i, height[i])
。
找出其中的两条线,使得它们与 x
轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。
说明:你不能倾斜容器。
算法思路
这个问题可以通过双指针技巧来解决。基本思路是:
- 初始化两个指针:一个指向数组的开始(
left
),一个指向数组的末尾(right
)。 - 计算面积:计算由这两个指针形成的矩形的面积,面积由较小的容器高度决定。
- 移动指针:移动较短的一边,以便更快地找到最大面积。
- 更新最大面积:在每次移动指针后,更新最大面积。
class Solution {
public int maxArea(int[] height) {
if (height == null || height.length < 2) {
return 0;
}
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),其中n是数组的长度。