给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
说明:你不能倾斜容器。
public class Solution {
public int maxArea(int[] height) {
//int a=0;
int area=0;
int tempArea=0;
//area1=Math.abs(height[1]-height[0]);
for (int i = 0; i < height.length-1; i++) {
for (int j = i+1; j < height.length; j++) {
int len=j-i;
int tall=height[i]-height[j]>=0?height[j]:height[i];
tempArea=Math.max(tempArea,len*tall);
}
area=Math.max(area,tempArea);
}
return area;
}
public static void main(String[] args) {
Solution solution = new Solution();
int[] a={1,8,6,2,5,4,8,3,7};
System.out.println(solution.maxArea(a));
}
}
这是我的暴力解法,虽然结果正确但是超时了。在想暴力解放的时候刚开始没想到如何保存一个数据,并让后面实时更新的数据与保存的数据进行对比,后来才意识到原来只需要在外面的for循环再来一遍Math.max(,)即可。暴力解法的算法复杂度O(n*n),空间复杂度O(1);
下面为官方解法:叫双指针法。
class Solution {
public int maxArea(int[] height) {
int maxArea=0;
int l=0;
int r= height.length-1;
while(l<r){
maxArea=Math.max(maxArea,(r-l)*Math.min(height[l],height[r]));
if(height[l]<height[r])
l++;
else
r--;
}
return maxArea;
}
}
大体的思路是:当左边的指针不动的时候来比较那就来比较两个指针对应的高,那边的指针对应的高,短就指针继续移动,而另一端也保持相对固定。同样右侧也是。如此一来时间复杂度只有O(n)