盛最多水的容器

盛最多水的容器

一般需要移动左右两头的问题可以考虑使用双指针

  1. 方法一:使用两重循环,遍历所有面积的可能,时间复杂度为O(n^2)级别

  2. 方法二:使用双指针,实质就是在移动的过程中不断消去不可能成为最大值的状态!

    • 左右两别分别使用l, r指向

    • 固定l, r指向较高的,移动较低的

    • 如图中,右边固定了最后一根柱子,左边从第一根柱子移动到第二根(因为左一较短)

    • 想象假如固定左边,长方形的高度就固定了(等于或小于左边矮的高度),右边再往左移面积只可能减小

    • 而如果移动固定右边,左边柱子的高度就有可能增高,长方形的高度就会增高,面积也有可能增高

int maxArea(vector<int>& height) {
    int maxs = 0, l = 0, r = height.size() - 1;
    while (l < r) {
        maxs = max(maxs, min(height[l], height[r]) * (r - l));
        if (height[l] > height[r]) {
            r --;
        } else {
            l ++;
        }
    }
    return maxs;
}
原文地址:https://www.cnblogs.com/mayapony/p/13035960.html