如题意,垂直的两条线段将会与坐标轴构成一个矩形区域,较短线段的长度将会作为矩形区域的宽度,两线间距将会作为矩形区域的长度,而我们必须最大化该矩形区域的面积。
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:写这个博客的目的不是为了写博客,而且为了督促自己每天要学习,加油!