题目链接
解题思路
初始时将两个指针放在数组两端,此时容器宽度最大。当前容积由宽度与两侧较短高度共同决定:
容积 = (right - left) × min(height[left], height[right])
计算当前容积后,移动高度较短的一侧。因为宽度一定会缩小,保留较短边无法突破当前高度瓶颈;只有移动较短边,才可能遇到更高的边界并得到更大容积。
复杂度
- 时间复杂度:
O(n) - 空间复杂度:
O(1)
Java 解答
class Solution {
public int maxArea(int[] height) {
int max = 0;
int left = 0;
int right = height.length - 1;
while (left < right) {
max = Math.max(max, (right - left) * Math.min(height[left], height[right]));
if (height[left] <= height[right]) {
left++;
} else {
right--;
}
}
return max;
}
}
复盘
暴力枚举所有左右边界需要 O(n²)。双指针每次排除不可能产生更优结果的一侧,在不遗漏最优解的前提下,将搜索过程压缩为一次线性扫描。