思路:双指针
在初始时,左右指针分别指向数组的左右两端;然后我们需要移动一个指针。移动哪一个呢?直觉告诉我们,应该移动对应数字较小的那个指针(即此时的左指针)。这是因为,由于容纳的水量是由 两个指针指向的数字中较小值 * 指针之间的距离 决定的。
-
时间复杂度:O(N),双指针总计最多遍历整个数组一次。
-
空间复杂度:O(1),只需要额外的常数级别的空间。
public class Solution {
public int maxArea(int[] height) {
//双指针分别列于两端
int l = 0, r = height.length - 1;
int ans = 0;
while (l < r) {
int area = Math.min(height[l], height[r]) * (r - l);
ans = Math.max(ans, area);
//向内移动较短边
if (height[l] <= height[r]) {
++l;
}
else {
--r;
}
}
//返回最大值
return ans;
}
}