题目描述
给定一个长度为 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;
}
};