题意:有n个相当于水桶的隔板,求使用两个隔板和底部x轴所能组成的水桶可以装载的最大容量。
第一种方法:两层遍历,第一层从0遍历到n-2,第二层从i+1遍历到n-1,每次求得(j-i)*(Math.min(height【i】,height【j】))与max比较,使max总是保存最大值。
缺点:需要n*n时间
第二种方法:线性时间,两个指针分别从0、n-1开始向中间靠拢,直到左指针不小于右指针。
靠拢规则:左高渡小于右高度,则左指针自加;否则右指针自加。因为最大值的产生肯定在同等宽度条件下的高度最大值。
时间:线性,代码如下:
/**
* https://leetcode.com/problems/container-with-most-water/#/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.
*/
package leetcode;
public class MaxArea {
public static void main(String[] args) {
}
public static int maxArea(int[] height) {
if (height==null || height.length<=0) {
return 0;
}
int left = 0, right = height.length - 1;
int max = 0;
while (left < right) {
int temp = (right-left)*Math.min(height[left], height[right]);
if (temp > max) {
max = temp;
}
if (height[left] < height[right]) {
left++;
} else {
right--;
}
}
return max;
}
}