双指针法
木桶短板效应, 面积等于较短边的长度*两边之间的距离,所以用双指针分别在一头一尾然后向中间移动。
begin指针指向开头,end指针指向最后,求面积后较短的边向中间移动。
为什么移动较短边?
我们先假设移动的是较长边a,保留较短的边b,然后分情况讨论
1、假如移动后a1>b,此时的面积还是由较短边b决定,area=b*(b-a1)
,跟移动前一样
2、假如移动后a1<b,此时面积由较短边a1决定,area=a1*(b-a1)
,面积比移动前更小
综上:若移动较短边b只会得到小于等于现在的面积
其实更通俗的说法,面积由较短边决定,那我们就应该让较短边尽量大,所以舍弃现在较小的边。
class Solution {
public:
int maxArea(vector<int>& height) {
int len=height.size();
int begin=0, end=len-1; //end要注意不是len而是len-1
int area=0,result=0; //area表示当前面积,result表示最大面积
while(end-begin){ //两个指针重合代表遍历结束
area=min(height[begin],height[end])*(end-begin);
//短板效应,面积等于较短边*两指针间距
result=max(result,area);
if(height[begin]>height[end]){
//哪个边短就移动哪个指针
end--;
}
else begin++;
}
return result;
}
};