解法:双指针

两个指针left, right,一个指向最左,一个指向最右,假设对应的纵坐标一个是x,一个是y,令x<y;

第一轮,要么left往右,要么right往左;由于x<y,所以高度由x决定,如果移动right,则横向长度变小,假设初始right-left=t,如果right向左移动,横向长度变为t1,且t1一定小于t;设right新位置纵坐标为y1,则新高度为min(x,y1),老高度为min(x,y);

若y1<y,则min(x,y1)>min(x,y);则移动right后的面积小于移动前面积

若y1>=y,则y1>=y>x,则min(x,y1) = min(x,y) = x,t1<t,则移动right后的面积小于移动前面积

因此,移动right后的面积一定小于移动前面积,所以移动right(也就是height偏高的一方)没有意义,因此移动left;

于是新的left和right又组成新的一轮,参考第一轮思路,永远移动height偏小的一方,并且实时更新面积最大值,即可找到。

class Solution {
    public int maxArea(int[] height) {
        int max_s = 0;
        int left = 0, right = height.length - 1;
        while(left < right){
            int current = (right - left)*Math.min(height[left], height[right]);
            max_s = Math.max(max_s, current);
            if(height[left] < height[right]) left++;
            else right--;
        }
        return max_s;
    }
}

更多推荐