双指针,双指针,想到双指针也没写出来。
class Solution {
public:
int maxArea(vector<int>& height) {
int length=height.size();
int i=0,j=length-1;
int res=(j-i)*min(height[i],height[j]);
while(i<j){
int left=(j-i-1)*min(height[i],height[j-1]);
int right=(j-i-1)*min(height[i+1],height[j]);
if(left>res)
{--j;res=left;}
else if(right>res)
{++i;res=right;}
else
{++i;--j;}
}
return res;
}
};
问题出在哪?我想每一步移动都能变大,但是实际上这是不可能的。
我分析出来最大的两个一定被包含在最终的边界里。但是怎么去做呢?
实际上,这道题的点在于,不是说每一次移动都会变大,但是肯定是朝着可能变大的方向移动,所以必须移动边界较小的那个,如果反过来移动,那么容量必然是只会变小,不会变大
class Solution {
public:
int maxArea(vector<int>& height) {
int length=height.size();
int i=0,j=length-1;
int res=0;
while(i<j){
int w=(j-i)*min(height[i],height[j]);
res=max(res,w);
if(height[i]<height[j])
++i;
else
--j;
//cout<<"i"<<i<<"j"<<j<<" ";
}
return res;
}
};