leetcode——盛水最多的容器(双指针)

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。

找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

返回容器可以储存的最大水量。

说明:你不能倾斜容器。

示例 1:

leetcode——盛水最多的容器(双指针)_第1张图片

输入:[1,8,6,2,5,4,8,3,7]
输出:49 
解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。

示例 2:

输入:height = [1,1]
输出:1
通过题目描述 我们应该会发现这道题目涉及到数组的遍历,联想到双指针,其时间复杂度为O(n)。

不知道大家做这道题的时候有没有想到木桶效应——一只水桶能装多少水取决于它最短的那块木板。这思路就来了

我们设置左右指针right,left。
定义目前最大值max

面积area

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

通过左右边界的高低进行左右指针移动的判断

左小于右 左移

右小于左 右移

确定了最短边界后,最大宽度(right-left)也确定了

其实在此时max也就确定了 下面我来解释:

在移动的过程中 宽度是减小的, 我们先假设取得max就是取得最大宽度的时候,若想推翻假设,那就需要在左/右移动的过程中找到比max更大的值,但是这里的宽度是递减的,要想找到更大的max 那只能提高木桶的边界(盛水的多少由宽度和最短边界的高决定),而最短边界的高在这次比较中是固定的了,所以确定了最短边界后,max也就确定了,记录max,进行下一轮比较。

所以只需要比较每一轮的最大宽度时的max就够了,可以结合图片自行思考。

本文参考了力扣作者:nettee的回答

链接:https://leetcode.cn/problems/container-with-most-water/solutions/94102/on-shuang-zhi-zhen-jie-fa-li-jie-zheng-que-xing-tu/

如有不足请指出,感谢阅读。 

你可能感兴趣的:(leetcode,算法,职场和发展)