力扣11 ,盛水最多的容器,每日刷题

s
如题意,垂直的两条线段将会与坐标轴构成一个矩形区域,较短线段的长度将会作为矩形区域的宽度,两线间距将会作为矩形区域的长度,而我们必须最大化该矩形区域的面积。

1. 暴力求解

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

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

结果不进入人意

执行用时 :431 ms, 在所有 Java 提交中击败了20.30%的用户
内存消耗 :44.8 MB, 在所有 Java 提交中击败了60.67%的用户

2. 双指针法

这种方法背后的思路在于,两线段之间形成的区域总是会受到其中较短那条长度的限制。此外,两线段距离越远,得到的面积就越大。

我们在由线段长度构成的数组中使用两个指针,一个放在开始,一个置于末尾。 此外,我们会使用变量 max 来持续存储到目前为止所获得的最大面积。 在每一步中,我们会找出指针所指向的两条线段形成的区域,更新 max,并将指向较短线段的指针向较长线段那端移动一步。

时间复杂度:O(n)只需要一次扫描
空间复杂度:O(1)

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

    }

执行结果:还行吧

执行用时 :6 ms, 在所有 Java 提交中击败了79.72%的用户
内存消耗 :38.4 MB, 在所有 Java 提交中击败了94.68%的用户

PS:写这个博客的目的不是为了写博客,而且为了督促自己每天要学习,加油!

猜你喜欢

转载自blog.csdn.net/qq_39455116/article/details/92786443