请注意,本文编写于 548 天前,最后修改于 548 天前,其中某些信息可能已经过时。

11.盛水最多的容器

题目描述

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

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

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

**说明:**你不能倾斜容器。

示例 1:

img

输入:[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 <= 105
  • 0 <= height[i] <= 104

基本思路

这个思路和计算两数之和三数之和差不多, 利用夹逼定理, 移动两个指针 , 盛水的大小时由最短的那一边决定的, 并且移动的过程中, 宽度是一直减小的

  • 选取 i =0, j = len -1
  • 每次循环计算盛水的面积, 宽 = j - i , 高 = min(i, j)
  • 指针移动 : 哪个是短板就移动哪个

代码实现

class Solution {
        public int maxArea(int[] height) {

            int i = 0, j = height.length - 1;
            int result = 0;

            while (j > i) {
                result = Math.max(result, Math.min(height[i], height[j]) * (j - i));
                if (height[i] < height[j]){
                    // 哪边小, 哪边就移动
                    i++;
                }else {
                    j--;
                }
            }

            return result;
        }
    }

本文作者:王天赐

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!