Container With Most Water
【题目】
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.
【解析】 题意:在二维坐标系中,(i, ai) 表示 从 (i, 0) 到 (i, ai) 的一条线段,任意两条这样的线段和 x 轴组成一个木桶,找出能够盛水最多的木桶,返回其容积。
两层 for 循环的暴力法会超时,所以尽早放弃这种懒惰的想法。
有没有 O(n) 的解法?
这个题类似于2NUM,是一个2pointer类型问题,用两个指针从两端开始向中间靠拢,如果左端线段短于右端,那么左端右移,反之右端左移,知道左右两端移到中间重合,记录这个过程中每一次组成木桶的容积,返回其中最大的。
class Solution {
public:
int maxArea(vector<int>& height) {
int len = height.size();
int i =0;
int j = len -1 ;
int MaxArea = 0;
while(i < j){
int v = abs(j-i)*min(height[i],height[j]);
if(v > MaxArea)
MaxArea = v;
height[i] > height[j] ? j-- : i++ ;
}
return MaxArea;
}
};
合理性解释:当左端线段L小于右端线段R时,我们把L右移,这时舍弃的是L与右端其他线段(R-1, R-2, ...)组成的木桶,这些木桶是没必要判断的,因为这些木桶的容积肯定都没有L和R组成的木桶容积大。
Area = (j-i)*min(height[i],height[j])当L右移时(j-i)减小 min height不变, area变小。