给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。

找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

返回容器可以储存的最大水量。 image


思路:创建双指针,分别从左右两端出发。储水量取决于左右两边较矮的那个,如果左边矮,就把左端往右移;如果右边矮,就把右端往左移。可以这样考虑:本身地面是在不断缩小的,要想储水量更多,只能寄希望于高度更高,即拓宽高度的下限。

C++13 linesExpandCollapse
int maxArea(vector<int>& height) {
    int ans = 0;
    int left = 0, right = height.size() - 1;
    
    while (left < right) {
        int h = min(height[left], height[right]);
        ans = max(ans, h * (right - left));
        
        if (height[left] <= height[right]) left++;
        else right--;
    }
    return ans;
}