【问题描述】
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 and n is at least 2.
问题来源: Container With Most Water【问题分析】
光看问题可能会有点不太理解,怎么形成一个容器去装水?其实此题只需要我们找出两条垂直X轴的线,以最短线的长度为高,组成的矩形的面积。简单的以图来表示一下:
找出最大的蓝色的面积。
我们取首尾两端的两条直线,这样就保证了最大的宽度,如何找出能装最多水的两条直线围成的容器呢?决定容器装水多少的永远是最短的那条边,这样我们只需提高最短线的高度了,如果左边的直线高度小于容器右边直线高度,左边直线指针右移;如果右边直线高度小于容器左边直线高度,右边直线指针左移,直至两条线重合。以图表示:
最多遍历一次,时间复杂度为O(N)。
【源代码】
class Solution {
public:
int maxArea(vector<int>& height) {
int maxArea = 0;
int area = 0;
int Height = 0;
int i = 0;
int j = height.size() - 1;
while (i < j) {
Height = height[j] > height[i]?height[i]:height[j];
area = (j-i)*Height;
maxArea = maxArea > area?maxArea:area;
if (height[i] > height[j]) {
j--;
} else {
i++;
}
}
return maxArea;
}
};