这道题的思路很巧妙,从两边同时向中间移动,只有在遇到更高的杆的时候在进行计算,因为即使相同的杆长,距离缩短容积也会减少。
public int maxArea(int[] height) {
if(height.length==0||height.length==1)return 0;
int i=0,j=height.length-1;
int ih=height[i],jh=height[j];
int area=0,tmp=0;
tmp=Math.min(ih,jh)*(j-i);
if(tmp>area) area=tmp;
while(i<j){
if(ih<jh){
while(height[i]<=ih&&i<j)i++;
if(i<j)ih=height[i];
}else{
while(height[j]<=jh&&i<j)j--;
if(i<j)jh=height[j];
}
if(i<j){
tmp=Math.min(ih,jh)*(j-i);
if(tmp>area) area=tmp;
}
}
return area;
}
Update 2015/08/23: 下面的代码思路一样,感觉比上面的写的好
public class Solution {
/**
* @param heights: an array of integers
* @return: an integer
*/
public int maxArea(int[] heights) {
// write your code here
if (heights.length == 0)
return 0;
int i = 0;
int j = heights.length - 1;
int max = 0;
while (i < j){
if (heights[i] < heights[j]){
max = Math.max(max, heights[i] * (j - i));
int tmp = heights[i];
while (i < j && tmp >= heights[i])
i++;
} else {
max = Math.max(max, heights[j] * (j - i));
int tmp = heights[j];
while (i < j && tmp >= heights[j])
j--;
}
}
return max;
}
}