题目:
给定一个高度数组,找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
思路
1. 暴力解法
由于题目中,要求的是找出其中的两条线,与x轴构成的容器,也就是说,找出数组中所有可能的两个高度的组合,很显然有种组合。
具体的遍历思路
[0] [1-n]
[1] [2-n]
...
代码:
class Solution {
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;
}
}
时间复杂度:O(n^2)
空间复杂度:O(1)
思路2:用双指针,朝着area可能变大的方向搜索
我们来看一下area的计算公式 area = min(height[l],height[r])*(r-l)
r-l肯定是不断减小的
那么,area主要就是由min(height[l],height[r])这一项决定的,那么怎样才能让这一项变大呢?
显然,只要让这里面的小值变大就行,也就是取里面的小值,然后变索引,直到遇到比当前height大的索引。
也就是说,把最外边的两条height中的小值往大的变。
class Solution {
public int maxArea(int[] height) {
int l = 0;
int r = height.length-1;
int maxarea = 0;
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;
}
}
时间复杂度:O(n),只需要扫描一次
空间复杂度:O(1)
这道题的优化思路在于,
目标是得到最大的面积,那么从area计算的方式出发,向area可能变大的方向搜索即可。