Problem
Notes
题意很好理解,容器能盛水的高度取决于左右两边中较短的那一边。
我们先考虑左边被固定的情况,那么我们只能移动右边界,开始先把右边界固定在最右边,那么右边界左移的时候,底减少了,那么如果要使左移有意义,那么必须使右边界增高。否则的话底也减少了,高也减少了,面积是肯定减少的。
那么上述情况下,我们可以把右边界先固定在左边,然后把右边界右移吗?会发现这时候情况就变得复杂,因为右边界右移的这个情况下,底在增长,所以无论右边界变高还是变矮,都有可能使面积增大。况且我们现在已经简化了原问题(把左边固定住了),回到原问题这么做会变得更加复杂。
那么经过如上分析,我们就可以知道此题的解法了,在左右分别设置一个指针,从左右边界中较小的一边往较大的一边移动,那么,整个容器的高才可能会增大,即使底在不断减小,最后的总面积也有可能变大。
Codes
class Solution {
public:
int maxArea(vector<int>& height) {
int n=height.size();
int ans=(n-1)*(height[0]<height[n-1]?height[0]:height[n-1]);
int i=0,j=n-1;
while(i<j)
{
height[i]<height[j]?++i:--j;
ans=max(ans,(j-i)*(height[i]<height[j]?height[i]:height[j]));
}
return ans;
}
};