Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ai). n vertical lines are drawn such that the two endpoints of line i is at (i, ai) and (i, 0). Find two lines, which together with x-axis forms a container, such that the container contains the most water.
Note: You may not slant the container.
题意:x轴整数坐标i上有高为h[i]的竖直板,求哪两个板围起来的面积最大。、
分析:简单的思路是枚举两个板,时间复杂度是O(n^2)
看到discuss里有一个O(n)的方法,头尾两指针向内移动,每次找两个指针中较低的板,该指针向内移动,可证明其为最优解
证明:反证法
设最优解为[left,right],且我们的O(n)方法未找到这个解
由于我们的方法两个指针遍历了所有n个板,所以left,right中至少有一个在我们的方法中被遍历到
设被遍历到的是left,那么在遍历到left时,在下列两种情况下,指针才会离开left向右移动:
(1)右指针也指向left,这时循环终止。但此时,右指针必然遍历到了right,所以矛盾
(2)右指针到达arr,且height[arr]>height[left],由于我们的方法没遍历到right,所以arr一定在right右边,那么可推出arr和left围上的面积一定比left和right围上的面积大,矛盾
所以,我们的方法找到的为最优解
代码:
class Solution {
public:
int maxArea(vector<int> &height) {
int ans = 0;
int l=0, r=height.size()-1;
while(l<r)
{
int now = min(height[l],height[r])*(r-l);
if(now>ans) ans = now;
if(height[l]<height[r]) l++;
else r--;
}
return ans;
}
};