双指针从两边向中间移动,寻找最大面积。
/**
* No.11
* @param height
* @return
*/
public int maxArea(int[] height) {
int maxSrea = 0;
int left = 0;
int right = height.length - 1;
while (left < right) {
maxSrea = Math.max(maxSrea, (right - left) * Math.min(height[left], height[right]));
if (height[left] > height[right]) {
right--;
} else {
left++;
}
}
return maxSrea;
}
淦!这么慢? = =+
【优化】
其实每次移动较短一遍的时候,不需要每移动一次就计算一次面积,如果下一条线小于上一条线,那么可以直接跳过(长宽都变小了)。
/**
* No.11
* @param height
* @return
*/
public int maxArea(int[] height) {
int maxSrea = 0;
int left = 0;
int right = height.length - 1;
int leftHeight = 0;
int rightHeight = 0;
while (left < right) {
leftHeight = height[left];
rightHeight = height[right];
maxSrea = Math.max(maxSrea, (right - left) * (leftHeight <= rightHeight ? leftHeight : rightHeight));
if (leftHeight >= rightHeight) {
while (rightHeight >= height[right] && left < right) {
right--;
}
}
if (leftHeight <= rightHeight) {
while (height[left] <= leftHeight && left < right) {
left++;
}
}
}
return maxSrea;
}