如题
最直接的做法,直接从所有两两组合中找最大
public static int maxArea(int[] height) {
int max = 0;
for (int i = 0; i < height.length - 1; i++) {// 左边界
for (int m = i + 1; m < height.length; m++) {// 右边界
if (Math.min(height[i], height[m]) * (m - i) > max) {
max = Math.min(height[i], height[m]) * (m - i);
}
}
}
return max;
}
效果不尽人意,很显然可以优化,是否可以通过一次遍历实现呢,需要用到双指针法了
public static int maxArea1(int[] height) {
int left=0;
int right =height.length-1;
int max =0;
int weight=right-left;
while(left!=right) {
max=Math.max(max, Math.min(height[left], height[right])*weight);
if(height[left]<=height[right]) {
left++;
}else {
right--;
}
weight--;
}
return max;
}
还是有余地,那么不使用math函数了
public static int maxArea2(int[] height) {
int left=0;
int right =height.length-1;
int max =0;
int weight=right-left;
while(left!=right) {
if(height[left]<=height[right]) {
max=max>height[left]*weight?max:height[left]*weight;
left++;
}else {
max=max>height[right]*weight?max:height[right]*weight;
right--;
}
weight--;
}
return max;
}
ok,基本上就这样了