一、原题
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.
二、中文
题目的意思是,数组中的每个数对应一条线段的长度,索引对应x坐标,两个索引可以组成一个底部的宽,高度就是前面所说的线段的长度,而既然是要盛水,高度就是两个线段中较短的一个。
三、举例
如输入数组{10, 1, 2, 3, 4, 5, 6, 7, 11}; 输出的结果是80,也就是8*10
四、思路
思路一:可以按照遍历的思路来进行,但是这样是非常低的效率
思路二:使用从两边向中间遍历的方式来进行,这样的效率就会提高,那什么时候移动左边,什么使用移动右边呢?
我们的思想是哪边低就移动那一半,因为这样才有可能获得更大的容量。
五、程序
package LeetCode;
public class Leetcode009 {
public static void main(String args[]){
int height[] = new int[]{7, 1, 2, 3, 4, 5, 8, 2, 3, 1};
System.out.println(maxArea(height));
}
/**
* @param height 一个数组,数组的每一列代表的是一个列
* @return 容器的的最大面积
*/
public static int maxArea(int []height){
if(height == null || height.length < 0){
return -1;
}
int left = 0;
int right = height.length - 1;
int maxArea = 0;
while(left < right && left >= 0 && right <= height.length - 1){
maxArea = Math.max(maxArea, Math.min(height[left], height[right]) * (right - left));
if(height[left] > height[right]){
right--;
}else{
left++;
}
}
return maxArea;
}
}
-------------------output----------------------
42