盛水最多的容器

150 阅读1分钟

题目说明:

输入:[1,8,6,2,5,4,8,3,7]
输出:49

思路:

  1. 使用双指针,一个指在最前面,一个指在最后面。
  2. 装水的大小主要由最短的那个高度决定。暴力做法是一个一个慢慢移动,但实际上是,把最短的那个板移动一格,忽略的那部分面积不会比下一个面积大。
  3. 设面积为S(i,j)=min(h[i],h[j])×(j-i)。向内移动短板,水槽的短板min(h[i],h[j])可能会变大,面积会变大。向内移动长板是必然减小面积,因为短板不变或变小,长度也变小。
  4. 在状态S(i,j)下向内移动短板至S(i+1,j)(假设h[i]<h[j]),相当于消去了S(i,j-1),S(i,j-2),...,S(i,i+1)。这些都一定小于等于S(i,j)。因为短板高度相同或更短,底边长度更短。
  5. 所以这样的双指针移动不会导致丢失面积的最大值。

代码:

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