一、题目
二、解题
注:本文均是Java代码
1、相向双指针
class Solution {
public int maxArea(int[] height) {
int left = 0, right = height.length - 1;
int result = 0;
while (left < right) {
if (height[left] < height[right]) {
result = Math.max(result,(right-left)*height[left]);
left++;
}
else {
result = Math.max(result,(right-left)*height[right]);
right--;
}
}
return result;
}
}
2、优化版本(100%击败)
如果右移之后比index小,那么面积一定也比之前小,所以继续右移,而且height[left] <= index必须在前边,&&双与运算,一假则假,前边假就不用计算后边,left小于right在终止前都是成立的,这样就会省去很多次计算result的时间。左移同理。
class Solution {
public int maxArea(int[] height) {
int left = 0, right = height.length - 1;
int result = 0;
while (left < right) {
result = Math.max(result,(right-left)*Math.min(height[left],height[right]));
if (height[left] < height[right]) {
int index = height[left];
// 如果右移之后比index小,那么面积一定也比之前小,所以继续右移
// height[left] <= index必须在前边
while (height[left] <= index && left < right) left++;
}
else {
int index = height[right];
// 如果左移之后比index小,那么面积一定也比之前小,所以继续左移
while (height[right] <= index && left < right) right--;
}
}
return result;
}
}