题目描述:
给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。
找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。
说明:你不能倾斜容器。
。
看见题目的第一反应是暴力硬解,用两遍for循环,一下就写出了以下代码
然而时间超时,
于是看了一眼题解,要用双指针,双指针也接触过,所以一下子就想到了
int maxArea(intheight, int heightSize){
int max(int a,int b);
int min(int a,int b);
int l=0;
int r=heightSize-1;
int ans=0;
while(l<r){
ans=max(ans,min(height[l],height[r])(r-l));
if(height[l]<height[r]){
l++;
}else{
r--;
}
}
return ans;
}
int max(int a,int b){
if(a>b){
return a;
}else{
return b;
}
}
int min(int a,int b){
if(a<b){
return a;
}else{
return b;
}
}
果然AC成功!
要使装的水最多,就要是长方形面积最大(即长乘宽最大);长为两条垂线的最短边,宽为两条垂线的距离。
所以我们采用左右双指针,左右两边的时候宽最大,所以让短的一边往中间移,当移到的那条比原来长的时候比较面积,取两者的最大值,然后让两条边的较短的往中间移,直到循环结束。