我目前能想到的方法是蛮力法:
public int maxArea(int[] height) {
int maxarea = 0;
for (int i = 0; i < height.length; i++)
for (int j = i + 1; j < height.length; j++)
maxarea = Math.max(maxarea, Math.min(height[i], height[j]) * (j - i));
return maxarea;
}
然鹅,蛮力法肯定是下策(复杂度ON2),那么怎么做呢?
Approach 2: Two Pointer Approach
用两根指针,分别指向最外侧的线条。如下图:
如果我现在移动最长的那根线,毫无疑问面积一定会缩小。
所以移动最短的那根线条(图为最左端)。
所以每次移动最短的那根线条,当两个指针重合结束搜索。复杂度ON
public int maxArea(int[] height) {
int maxarea = 0, l = 0, r = height.length - 1;
while (l < r) {
maxarea = Math.max(maxarea, Math.min(height[l], height[r]) * (r - l));
if (height[l] < height[r])
l++;
else
r--;
}
return maxarea;
}