leetcode 11. 盛最多水的容器 双指针

  1. 盛最多水的容器

方法一 双层for 暴力枚举的方法会超时

class Solution {
    public int maxArea(int[] height) {
        int size = height.length;
        int water = 0;
        for (int i = 0; i < size; i++) {
            for (int j = i; j < size; j++) {
                int tmp = height[i] <= height[j] ? height[i] * (j - i) : height[j] * (j - i);
                water = water <= tmp ? tmp : water;
                }
            }
        return water;
    }
}

方法二 双指针 消除无法成为边界的选择

双指针之内的索引是要被考虑的边界范围,我们需要缩小边界范围,用于排除情况。

以左右指针作为容器的边界,左右指针的移动视为边界的调整。
每次指针的移动是要考量的,是先移动左指针还是移动右指针。
假如哦我们移动移动指向大的指针。
初试一个容器,左右指针指向数组的首尾。左指针指向的数组内容为x,右…为y。
容器可以装的水为min(x,y) * array.length
假设x 此时,容器可以装的水为min(x,y1) (array.length -1)
如果y1 array.length -1 array.lenth
如果y1>=x, 有x
(array,lengh -1) < x*array.length
所以移动右指针后装的水变少
因此在移动左右指针的时候,是没有必要移动指向大的指针的。

综上推导过程,我们只需移动小的指针即可

class Solution {
    public int maxArea(int[] height) {
        int lp = 0;
        int rp = height.length - 1;
        int waterArea = 0;
        while (lp < rp) {
            int tmpWaterArea = Math.min(height[lp], height[rp]) * (rp -lp);
            if (tmpWaterArea >= waterArea) {
                waterArea = tmpWaterArea;
            }
            if (height[lp] <= height[rp]) {
                ++lp;
            } else {
                --rp;
            }
        }
        return waterArea;
    }
}

注意事项:

可以使用Math.max min来简化比较
赋值时++lp 和 lp++不同

你可能感兴趣的:(数据结构与算法,leetcode,算法,c++)