11. Container With Most Water

来源:互联网 发布:淘宝网流量分析 编辑:程序博客网 时间:2024/05/29 09:24

二分搜索。

给定n个非负数整数a1, a2, ..., an, 每个数代表坐标(i, ai)的一个点。以(i, ai) 和 (i, 0)为线段的端点画了n条垂直的线。 找到其中两条, 使他们和x轴形成的一个容器可以装最多的水。

我们需要定义i和j两个指针分别指向数组的左右两端,然后两个指针向中间搜索,每移动一次算一个值和结果比较取较大的,容器装水量的算法是找出左右两个边缘中较小的那个乘以两边缘的距离.

最大盛水量取决于两边中较短的那条边,而且如果将较短的边换为更短边的话,盛水量只会变少。所以我们可以用两个头尾指针,计算出当前最大的盛水量后,将较短的边向中间移,因为我们想看看能不能把较短的边换长一点。这样一直计算到左边大于右边为止就行了。

class Solution {public:    int maxArea(vector<int>& height) {        int res = 0, i = 0, j = height.size() - 1;        while (i < j) {            res = max(res, min(height[i], height[j]) * (j - i));            height[i] < height[j] ? ++i : --j;        }        return res;    }};