LeetCode:11. 盛最多水的容器

题目

LeetCode: Container With Most Water

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

注意:你不能倾斜容器,n 至少是2。

思路

左右指针法
首先指针指向最左、最右

当左边的高度大时,移动左边的边的面积只能是小于当前面积
因为底 = 原来的底 - 1,高最大只能是右边的边的高
所以只能移动右边的高

同理,右边的高大的话,只能移动左边指针才可能获得更大的面积

代码

查看更多LeetCode代码

int maxArea(int* height, int heightSize) {
    int max = 0;
    int left = 0;
    int right = heightSize - 1;
    int cur = 0;
    //左右指针法,时间复杂度O(N)
    while (left < right)
    {
        //cur为当前面积
        cur = (right - left) * (height[left] < height[right] ? height[left] : height[right]);
        if (max < cur)
        {
            max = cur;
        }
        if (height[left] > height[right])
        {
            //当左边的高度大时,移动左边的边的面积只能是小于当前面积
            //因为底 = 原来的底 - 1,高最大只能是右边的边的高
            //所以只能移动右边的高
            right--;
        }
        else
        {
            //分析同上
            left++;
        }
    }
    return max;
}

猜你喜欢

转载自blog.csdn.net/Boring_Wednesday/article/details/80473521