给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
说明:你不能倾斜容器,且 n 的值至少为 2。
思维题,如果直接暴力,那么就是N平方的复杂度,写起来也简单,双重循环跑一遍即可。
但是平方的复杂度太高了,现在考虑线性算法。
先令l = 0,r = len-1,计算面积,这个面积是长度最长时的面积,当然也可能是最大面积的一种可能性,我们令其为初始状态。
既然要把算法从平方降到线性,那么必定是有一些状态是直接忽略不予考虑的,如果当前的l = i,r = j,假设height[i]>height[j],令l++,那么一共少了(l,r) = (i,j-1),(i,j-2)…(i,i+1)种可能的矩形面积情况,但是注意到,这些可能的矩形面积,全部小于当前(l,r) = (i,j)的面积!
这是因为首先长度由于l++就缩短了一个单位,其次宽度由于height[j]不变,所以宽度不可能提高,所以如果令短的一边移动一下,不会对最终的面积产生影响。
所以由上文提到的初试状态开始,每次选择较短的边移动一下,就可以得到最终答案。
class Solution {
public int maxArea(int[] height) {
int len = height.length;
int ans = 0;
int l = 0;
int r = len - 1;
while(l<r)
{
ans = Math.max(ans,Math.min(height[l],height[r])*(r-l));
if(height[l]<height[r])
l++;
else
r--;
}
return ans;
}
}