题目描述

给定一个长度为 n 的整数数组height。有n条垂线,第 i 条线的两个端点是(i, 0)和(i, height[i])
找出其中的两条线,使得它们与x轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。
说明:你不能倾斜容器。

样例

输入:[1,8,6,2,5,4,8,3,7]
输出:49 
解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为49。

算法1

(双指针) $O(n)$
做法:两个指针分别往前和往后指,然后如果h[i] > h[j] 的话,那么j--
反之 i++

证明:假设最优解对应的指针节点为 i1,j1
那么当 i = i1时,j一定会向j1靠近.
V = min(h[i1],h[j1]) * (j1 - i1)
V2 = min(h[i1],h[j2]) * (j2 - i1)
反证法:假设j2 > j1的话(说明往反方向走了)也就即(j2 - i1) > (j1 - i1)并且h[j2] < h[j1],
不然的话V2 > V与 V是最优解矛盾

C++ 代码

class Solution {
public:
    int maxArea(vector<int>& height) {
        int res = 0;
        for(int i = 0 , j = height.size() -1; i < j ;){
            res = max(res,min(height[i],height[j]) * (j - i));
            if(height[i] < height[j]) i ++;
            else j--;
        }

        return res;
    }
};

越努力越幸运