盛水最多的容器

问题描述:

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

代码:

public int maxArea(int[] height) {
    if (height.length <= 1) {
        return -1;
    }
    int i = 0, j = height.length - 1, res = 0;
    while (i < j) {
        int h = Math.min(height[i], height[j]);
        res = Math.max(res, h * (j - i));
        if (height[i] < height[j]) {
            i++;
        } else {
            j--;
        }
    }
    return res;
}

分析

我们可以借助消除短板的思想来理解。

这个问题,我们也可以用暴力来求解,只是效率比较差罢了,但是暴力算法是列出了所有的情况,而这个消除短板的算法则排除了很多多余的的情况。

比如,我们选取上面的while循环的一种情况,假设 height[i] < height[j],我们先将此时的 height[i]height[j] 与x轴围成的面积给取出来,如果比之前所取到的最大值还要大,那么,就更新最大值,然后,我们就将 i 的值加一,为什么就可以直接将索引往后移动一位了呢?我们可以假设我们还保留着这块短板,那么,除了最初的 height[i]height[j] 围成面积的情况,我们只需要简单思考一下就可以明白其它的任何的 j 左边的板子和 height[i] 组成的面积都不会大于最初的面积,因此,我们就可以直接让 i 的值加一。反之,高板则不能排除。

posted @ 2020-09-30 19:52  模糊计算士  阅读(154)  评论(0编辑  收藏  举报