/** * 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 * * 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 * * 返
/** * 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 * * 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 * * 返回容器可以储存的最大水量。 * * 说明:你不能倾斜容器。 * * 输入:[1,8,6,2,5,4,8,3,7] * 输出:49 * 解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。 * * 输入:height = [1,1] * 输出:1 */public class AreaMax_11 {
public static void main(
String[]
args) {
int[]
height = {
1,
8,
6,
2,
5,
4,
8,
3,
7};
System.
out.
println(
maxArea1(
height)); }
/** * 暴力解法 容易超时 * @param height * @return */ public static int maxArea(
int[]
height) {
int res = 0;
int weight = 0;
int max = 0;
while (
weight < height.
length){
for (
int i = weight + 1;
i < height.
length;
i++) {
if (
height[
weight]
< height[
i]){
res = height[
weight]
* (
i - weight); }
else {
res = height[
i]
* (
i - weight); }
max = Math.
max(
res,
max); }
weight++; }
return max; }
// 优化面积公式为s(i,j) = min(h[i],h[j]) * (j-i) public static int maxArea1(
int[]
height) {
int i = 0;
int j = height.
length - 1;
int s = 0;
int max = 0;
while (
i < j){
if (
height[
i]
<= height[
j]){
s = Math.
min(
height[
i],
height[
j])
* (
j - i);
max = Math.
max(
s,
max);
i++; }
else {
s = Math.
min(
height[
i],
height[
j])
* (
j - i);
j--;
max = Math.
max(
s,
max); } }
return max; }}
注意:解释第二个优化的方法:由于面积的高是由短板决定的,所以长板向移动的时候高不变,底变小,面积变小。反之,短板移动的时候可能使高增加,底变小,所以面积可能增加可能减小。所以每次只移动短板即可根据面积公式计算出最大面积。