题目:给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。画 n 条垂直线,使得垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
注意:你不能倾斜容器,n 至少是2。
解法1:暴力
class Solution {
public int maxArea(int[] height) {
int len = height.length;
int result = 0;
int temp = 0;
for(int i = 0;i < len;i++){
for(int j = i+1;j<len;j++){
temp = (j-i)*Math.min(height[i],height[j]);
if(temp>result){
result = temp;
}
}
}
return result;
}
}
这种计算就是循环嵌套遍历,得出最大的面积;这种在leetcode是超时的;
时间复杂度:O(n^2);
空间复杂度:O(1);
解法2:
class Solution {
public int maxArea(int[] height) {
int result = 0;
int left = 0;
int temp = 0;
int right = height.length-1;
while(left<right){
temp = (right-left)*Math.min(height[left],height[right]);
result = area > result ? temp : result;
if(height[left]<height[right]){
left++;
}else{
right--;
}
}
return result;
}
}
这里是从两端向中间依次计算,因为计算面积取决于两个点低的那一个,所以把低的那一个向中间移一个位置,再计算。
时间复杂度:O(n);
空间复杂度:O(1);