- 题目描述
给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
说明:你不能倾斜容器,且 n 的值至少为 2。
来源:LeetCode(https://leetcode-cn.com/problems/container-with-most-water)
- 示例
输入:[1,8,6,2,5,4,8,3,7]
输出:49
- 思路分析
- 双重循环法:很容易想到,简单粗暴,时间复杂度为O(n2)
- 动态规划法:采用滑动窗口。刚开始将窗口设置为最大值,然后逐步缩小,每次将后移或前移相对更小的数的指针。
- JAVA实现
- 双重循环法`
public class MaxArea {
public static int maxArea(int[] height) {
int len = height.length, maxArea = 0;
for(int i=0; i<len-1; i++) {
int start = height[i], last = 0;
for(int j=len-1; j>i; j--) { //宽度差在变小,如果想要得到更大的面积,高必须变大
int end = height[j];
if(end <= last) continue;
else {
int area = (j-i) * (start < end ? start : end);
if(area > maxArea) {
last = end;
maxArea = area;
}
}
}
}
return maxArea;
}
}
- 动态规划法
public class MaxArea {
public static int maxArea_(int[] height) {
int len = height.length, maxArea = 0, i = 0, j = len - 1, last = 0;
while(j - i > 0) {
int min = height[j]>height[i] ? height[i] : height[j];
if(min > last) {
int area = (j-i)*min;
if(area > maxArea) {
maxArea = area;
last = min;
}
}
if(height[i] > height[j]) j--;
else i++;
}
return maxArea;
}
}