算法初探-盛最多水的容器

136 阅读2分钟

LeetCode11:盛最多水的容器

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

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

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

说明: 你不能倾斜容器。

示例 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

提示:

  • n == height.length
  • 2<=n<=1052 <= n <= 10^5
  • 0<=height[i]<=1040 <= height[i] <= 10^4

思路分析

双指针移动,左指针为i,右指针为j 初始化为i=0,j=length-1;length为数组的长度 面积起始已经出来了 就是i与j围成的 如果左边比右边高度矮,每次保留最高可以保证下一次求得的面积是某种意义的最大值 其实就是求的这么多次肯定把最大面积包括进去了,然后通过max取最大值

  • 定义两个指针i,j,分别首尾位置相对移动
  • 定义变量 maxVolume 表示所求的最大值

算法代码

public int maxArea(int[] height) {
    int length = height.length;
    //存最大值
    int max = 0;
    //两个指针分两边,每次求的面积就是i与j之间的面积,
    //当然  高度是最小的那一个,,
    for (int i = 0, j = length - 1; i < j;) {
        //如果左边的高度比右边大,我们就移动右边j--;
        //因为这样左边大我们就可以找出最大值,
        if (height[i] > height[j]) {
            //存值,存i与j之间的面积
            max = Math.max(max, (j - i) * height[j]);
            //左边
            j--;
        } else {
            //与上同理
            max = Math.max(max, (j - i) * height[i]);
            //存值,存i与j之间的面积
            i++;
        }
    }
    return max;
}

结果详情

Snipaste_2023-04-10_22-38-50.png

算法复杂度

  • 空间复杂度:O(1)O(1)
  • 时间复杂度:O(n)O(n)

掘金(JUEJIN)一起进步,一起成长!