首页 > 代码库 > 11. Container With Most Water

11. Container With Most Water

Given n non-negative integers a1a2, ..., an, where each represents a point at coordinate (iai). n vertical lines are drawn such that the two endpoints of line i is at (iai) 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.

对于两个坐标(i, ai)和(j, aj),它们之间形成的区域面积为min(ai, aj)*(j - i)。

蛮力算法的时间复杂度为O(n2),我们尝试着进行改进。

借鉴two pointers的做法:由于矩形区域的面积是长乘以高,将两个指针分别放在数组的首端和尾端,此时j - i的值最大。那么其他矩形的面积如果要超过这个矩形,就必须有高度超过该矩形的高度。

因此,我们可以尝试让两个指针不断地向中间靠拢,直至高度超过上一个矩形的高度,然后计算面积,进行比较。终止条件是两个指针相遇。

这种方法的时间复杂度是O(n)。

class Solution {
public:
    int maxArea(vector<int>& height) {
        int n = height.size();
        if (n < 2)
            return 0;
            
        int max_area = 0;
        for (int i = 0, j = n - 1; i < j; ) {
            int high = std::min(height[i], height[j]);
            int cur_area = high * (j - i);
            max_area = std::max(max_area, cur_area);
            while (i < j && height[i] <= high)
                ++i;
            while (i < j && height[j] <= high)
                --j;
        }
        return max_area;
    }
};

 

11. Container With Most Water