leet code 11. 盛最多水的容器

题目描述

给定一个长度为 n 的整数数组 height 。

有 n 条垂线,

第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。

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

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

说明:你不能倾斜容器。

leet code 11. 盛最多水的容器_Math

提示:

  • n == height.length
  • leet code 11. 盛最多水的容器_ide_02
  • leet code 11. 盛最多水的容器_ide_03

题目解析

本题利用双指针解决。那么引申出两个问题

  • 如何利用双指针解决问题
  • 双指针解决——为什么是对的,如何证明?

双指针解题思路过程验证

  1. 初始化数组的左右边界为左右指针,那么计算出 盛水量 = min(height[left], height[right]) * (right - left)
  1. 很显然,左右指针谁指向的元素值更小,应该移动谁
  2. 为什么?
  1. 因为盛水量的多少取决于较短的一条边
  2. 所以移动较短的一条边,才有可能找到更多的盛水方案
  1. 如果左右两边高度相同
  1. 那么可以随意移动其中一条边
  2. 计算盛水量始终取决于较短的边,所以任意移动左右指针之后,计算出的面积不会大于移动之前
  3. 因为其底部长度减少了.

show code

class Solution {
    public int maxArea(int[] height) {
        int n = height.length;
        int left = 0,right = n - 1;
        int ans = 0;
        while(left < right) {
            // 底边长度计算.
            int rSide = right - left;
            // 计算得出较短的边.
            int hSide = Math.min(height[left], height[right]);
            // 计算盛水量.
            ans = Math.max(ans, rSide * hSide);

            if(height[left] < height[right]) {
                left++;
            } else {
                right--;
            }
        }
        return ans;
    }
}