题目
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.
思路
这道题采用双层循环暴力求解肯定会Time Limited,其实考察的是Two Pointers的知识点,给定两个指针left和right分别指向容器的左端和右端,向中间靠拢,可以在O(n)时间里找到最大容量。核心思想是:当left的高度<right的高度时,就不需要考虑left和right右侧的线段为两端的容器了,因为决定容器容量多少取决于较短的那条线段,令left++,反之亦然。
代码
public class Solution {
public int maxArea(int[] height) {
int left = 0;
int right = height.length - 1;
int maxVolume = 0;
while (left < right) {
int volume = Math.min(height[left],height[right])*(right - left);
if (volume > maxVolume)
maxVolume = volume;
if (height[left] <= height[right])
left++;
else
right--;
}
return maxVolume;
}
}