题目描述

原题

Description:

Given n non-negative integers a1, a2, …, an , where each represents a point at coordinate (i, ai).
n vertical lines are drawn such that the two endpoints of line i is at (i, ai) and (i, 0).
Find two lines, which together with x-axis forms a container, such that the container contains the most water.

Note:
You may not slant the container and n is at least 2.

Example:

Input: [1,8,6,2,5,4,8,3,7]
Output: 49
Explanation:

Example_Explanation
Example_Explanation

原题翻译

描述:

给定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
解释:

例子解释
例子解释

解法一(Mine)

主要思想

得到可能出现的面积,求最大值。

运行速度:超过了16.18%的解答。

内存使用:超过了95.51%的解答。

源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Solution {
public int maxArea(int[] height) {
int result = 0;
for (int i = 0; i < height.length; i++) {
for (int j = i + 1; j < height.length; j++) {
int temp = Math.min(height[i], height[j]);
int r = temp * (j - i);
if(r > result)
result = r;
}
}
return result;
}
}

解法二

主要思想

仔细想想,解法一有什么问题?
在本题的例子中,第一条线高度为1,如果按照第一种解法运行,右边界需要从左往右遍历,依次求面积进行比较。但事实上,容器的高是由最短的线决定的,容器的面积毫无疑问地随右边界的增加而增加。我们真的有必要求出每块面积进行比较吗?
没错,这道题可以由一个标准的首尾指针法来解。

运行速度:超过了95.02%的解答。

内存使用:超过了100%的解答。

源码

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Solution {
public int maxArea(int[] height) {
int maxarea = 0, l = 0, r = height.length - 1;
while (l < r) {
maxarea = Math.max(maxarea, Math.min(height[l], height[r]) * (r - l));
if (height[l] < height[r])
l++;
else
r--;
}
return maxarea;
}
}