leetcode hot 100---num 5,盛最多水的容器
·
解法:双指针
两个指针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;
}
}
更多推荐

所有评论(0)