Leetcode 盛最多水的容器

 

给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

说明:你不能倾斜容器,且 n 的值至少为 2。

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

示例:

输入:[1,8,6,2,5,4,8,3,7]
输出:49

/*

思路: 双指针,第一个指针指向数组头部,第二个指针指向数组尾部
    每次计算出来目前最大承载量,限制目前承载量的是i和j中量最小的那个.
    然后把量小的i或者j向对方靠近.
*/
int maxArea(int* height, int heightSize){
    int i=0, j=heightSize-1;
    int area = 0, tmp;
#define max(a, b) (a)>(b)?(a):(b)
#define min(a, b) (a)<(b)?(a):(b)
    while (i<j) {
        tmp = (j-i) * (min(height[i], height[j]));
        area = (max(tmp, area));
        if (height[i]<height[j]) ++i;
        else --j;
    }
    return area;
}
原文地址:https://www.cnblogs.com/micoblog/p/13337857.html