11:盛最多水的容器(C++)

题目地址:https://leetcode-cn.com/problems/container-with-most-water/

题目描述

给你 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:暴力。枚举左右柱子left和right所围成的面积,计算面积area=(y-x)*hegiht_dff,其中高度差height_diff=min(height[x], height[y]),返回最大面积值即可。可惜超时,时间复杂度O(n^2);

思路2:左右夹逼。左右柱子left和right向中间收敛,如果左指针代表的左柱子高度较小,移动左指针向右,即left++,否则,移动右指针向左,即right--,当然了,如果左右柱子高度相等,则将左右柱子同时向中间移动一步。因为只需要遍历一遍数组,所以时间复杂度为O(n)。类似题目,还有167、240。

程序源码

思路1:超时

class Solution {
public:
    int maxArea(vector<int>& height) {
        if(height.size() < 2) return 0;
        int area = 0;
        for(int left = 0; left < height.size() - 1; left++)
        {
            for(int right = left + 1; right < height.size(); right++)
            {
                area = max(area, (right - left)*min(height[left], height[right]));
            }
        }
        return area;
    }
};

思路2

class Solution {
public:
    int maxArea(vector<int>& height) {
        if(height.size() < 2) return 0;
        int area = 0;
        int left = 0, right = height.size() - 1;
        while(left < right)
        {
            int minHeight = height[left] < height[right]? height[left++]:height[right--];
            area = max(area, (right - left + 1)*minHeight);
        }
        return area;
    }
};
----------------------------------- 心之所向,素履所往;生如逆旅,一苇以航。 ------------------------------------------
原文地址:https://www.cnblogs.com/wzw0625/p/13529994.html