题目:
给定 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
Java:
class Solution {
public int maxArea(int[] height) {
int l=0;
int r=height.length-1;
int v;
int maxv=0;
while(l!=r){
if(height[l]<height[r]){
v=(r-l)*height[l];
l++;
}
else{
v=(r-l)*height[r];
r--;
}
maxv=maxv>v?maxv:v;
}
return maxv;
}
}
c
int maxArea(int* height, int heightSize){//双指针法
int l=0;//左
int r=heightSize-1;//右
int v;//中间变量
int maxv=0;//最大
while(l!=r){
if(height[l]<height[r]){
v=(r-l)*height[l];
l++;//如果上一句前面便跳过第一个(下:最后一个)节点
}
// if(height[l]>height[r]){
// v=(r-l)*height[r];
// r--;
// }(如果有if,则时间复杂度增加o(n),成为2o(n),else用来减少时间复杂度)
else{
v=(r-l)*height[r];
r--;
}
maxv = maxv > v ? maxv : v ;
}
return maxv;
}
这个题用的双指针法。
想要得到盛最多水的容器,一方面要考虑他的宽度,一方面要考虑他的高度。
两方面都要考虑,所以可以先设定一个初值,max,来记录每次指针移动后的盛水的量,然后移动两端相比最小的那一边(已确保高度最大),直至遍历一遍(right==left),将得到的max输出即可。