2020/5/8第二题
题目描述:
给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
说明:你不能倾斜容器,且 n 的值至少为 2。
图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。
示例:
输入:[1,8,6,2,5,4,8,3,7]
输出:49
整体思路:
就是看长×高的值,找出最大的
题解1:暴力,枚举
class Solution {
public int maxArea(int[] height) {
int max = 0;
for(int i = 0;i < height.length - 1;++i) {
for(int j = i + 1;j < height.length;++j) {
int area = (j - i) * Math.min(height[i], height[j]);
max = Math.max(max,area);
}
}
return max;
}
}
- 时间复杂度O(n^2),执行用时444ms,很慢
- 虽然思路简单,但是也要有注意的地方:
- 外层循环i从0开始,i < height.length -1
- 内层循环j从1开始,j < height.length
- i 和 j 至少相差了一个位置
题解2:
class Solution {
public int maxArea(int[] height) {
int max = 0;
for(int i = 0,j= height.length-1;i<j; ){
int minHeight = height[i] < height[j] ? height[i++] : height[j--];
int area = (j - i + 1) * minHeight;
max = Math.max(max,area);
}
return max;
}
}
O(n) 执行用时4ms
思路:
- 首先确定两个左右边界,边界一点点的往中间移动一直到i = j,在移动的过程中看高度,如果比边界的高度还低就不用比了,因为肯定不会比之前的面积还要大(至于为什么,画个图就懂了^ . ^)。