Question
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.
*Difficulty: Medium
https://leetcode.com/problems/container-with-most-water/
Solution
brute force太慢通不过,于是要用TWO POINTER的方法。
一个pointer从前,一个pointer从后,如果其中一个大,则另一个指针往中间移动(写code得时候容易忘记从后面走向中间的pointer应该是–),每次移动都把现在得到的面积跟maxArea作对比,取最大值
public class Solution {
//brute force
public int maxArea(int[] height) {
if(height.length < 2) return 0;
int i = 0; int j = height.length-1;
int x1 = i; int x2 = j;
int y1 = height[i]; int y2 = height[j];
int maxArea = getArea(x1, x2, y1, y2);
while(i < j && i < height.length && j < height.length){
maxArea = Math.max(getArea(i, j, height[i], height[j]), maxArea);
if(height[i] > height[j]) j--;
else i++;
}
return maxArea;
}
public int getArea(int x1, int x2, int y1, int y2){
return Math.abs(x1-x2)*Math.min(y1,y2);
}
}