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.
题意:
给一个数组,数值代表坐标点 (i, ai),现在要求任意两根线和x轴组成的容器最多可以放多少水,既求最大面积,注意容器不能倾斜
最简单的两层循环会超时,看了一下discuss里面有人加了一些控制条件可以通过
discuss里赞同数最高的答案 https://leetcode.com/discuss/11482/yet-another-way-to-see-what-happens-in-the-o-n-algorithm 用画二维数组的方式解释了为什么可以用双指针实现,自己又画了个坐标图再补充一下
left从第1开始,right从5开始,如果1比5短,那么不管2,3,4的高度是比1大还是小,算出来的面积暂且用are(i,5)表示,i从2到4,都比are(1,5)小,所以left指针往右移一步
同理,如果1比5长,算出来的面积are(1,j),j从2到4,也都比are(1,5)小,所以right可以左移一步
结束条件是左右两个指针相遇,O(n)就可以完成
public int maxArea(int[] height) {
if (height == null || height.length == 1) return 0;
int left = 0, right = height.length - 1;
int max = Integer.MIN_VALUE;
while (left < right) {
max = Math.max(max, (right - left) * Math.min(height[left], height[right]));
if (height[left] < height[right]) {
left++;
} else {
right--;
}
}
return max;
}