# 每日一题(8):盛最多水的容器

image-20210127224147580

# 开始

今天这道题看上去是真简单

做也是真5分钟做出来了...

但时间复杂度直接O(n*(n-1))

想了许久优化方案,都没能把双层for优化掉

只能跳过几步,基本上没有质变

实在绷不住了

偷瞄了一眼题解,顿时恍然大悟

双指针

[1, 8, 6, 2, 5, 4, 8, 3, 7]

左指针指向1,右指针指向7

容水量 = min(1, 7) * 8 = 8

那么我要使容水量更多的话,移动哪根指针会更可能发生呢?

由于取的是min

所以是值较小的指针,也就是左指针

如此往复

走过n步后,那个全局最大值49,就是答案了

那么为什么可以这样做呢?

题解有详细证明过程,此处不做赘述,直接贴了

image-20210127225404671

代码如下:

class Solution {
    public int maxArea(int[] height) {
        int maxArea = 0;
        int i = 0;
        int j = height.length - 1;
        while (i != j) {
            int minHeight = Math.min(height[i], height[j]);
            int distance = j - i;
            int area = minHeight * distance;
            maxArea = Math.max(area, maxArea);
            if (height[i] <= height[j]) {
                i++;
            } else {
                j--;
            }
        }
        return maxArea;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

这次就不贴执行用时了,毕竟不是自己的成果,再香也不行

明天继续

最近更新: 7/5/2021, 2:10:34 PM