给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
解题思路1.双指针,左右加逼(复杂度最低,最好,提供两种写法)
2.无脑暴力,将所有面积的可能放到list集合中,用Collections工具类取集合中的最大值
3.也是无脑暴力,与方法二差不多
双指针写法一:
public int maxArea(int[] height) {
int maxarea = 0;
for (int i = 0, j = height.length - 1; i < j; ) {
if (height[i] < height[j]) {
i++;
} else {
j--;
}
maxarea = Math.max(maxarea, (j - i) * Math.min(height[i], height[j]));
}
return maxarea;
}
双指针写法二:
public int maxArea(int[] height) {
int mianji = 0;
int i = 0;
int j = height.length - 1;
while (i < j) {
if (height[i] < height[j]) {
mianji = Math.max(height[i] * (j - i), mianji);
i++;
} else {
mianji = Math.max(height[j] * (j - i), mianji);
j--;
}
}
return mianji;
}
集合暴力法:
public static int maxArea(int[] height) {
List<Integer> res = new ArrayList<>();
for (int i = 0; i < height.length; i++) {
for (int j = i; j < height.length; j++) {
if (i != j) {
int m = Math.min(height[i], height[j]) * (j - i);
res.add(m);
}
}
}
Integer max = Collections.max(res);
return max;
}
普通暴力法:
class Solution {
public int maxArea(int[] height) {
int mianji = 0;
for (int i = 0;i < height.length - 1;i++){
for (int j = i+1; j < height.length; j++) {
int m = Math.min(height[i], height[j])* (j - i);
mianji = Math.max(mianji,m);
}
}
return mianji;
}
}