LeetCode 11 : 盛最多水的容器 C++ 贪心

描述

给定 n 个正整数 a1,a2,…,an,其中每个点的坐标用(i, ai)表示。 画 n 条直线,使得线 i 的两个端点处于(i,ai)和(i,0)处。请找出其中的两条直线,使得他们与 X 轴形成的容器能够装最多的水。
注意:你不能倾斜容器,n 至少是2。

分析

应该很容易想到暴力的从头到尾两两比较,复杂度为O(n^2)
那么有没有简化一点的方法呢?
分别从左边和右边开始
举个例子

1 3 5 4 2
2 3 5 4 1

选首尾两个点的时候,面积是1*4 = 4
上面的情况,左边比右边低,所以左边限制盛水高度。这个时候如果右边向右移动,最小高度不会变,还是1(要变也只会更小),但是底变小了,所以面积肯定会变小。所以这种情况下应该移动作为低边的左边;
同理,针对下面的情况,右边比左边低,如果左边右移面积只会更小,所以移动的是右边,通过可能修改最低边的高度来使得面积加大

代码

int maxArea(vector<int>& height) {
      int len = height.size();
    int left = 0, right = len - 1;
    int maxx = 0,temp;
    while (left<right&&left<len-1 && right>=0)
    {
        temp = min(height[left], height[right])*(right - left);
        if (temp > maxx)maxx = temp;
        if (height[left] < height[right])left++;
        else right--;
    }
    return maxx;
    }

猜你喜欢

转载自blog.csdn.net/beforeeasy/article/details/79818037