Leetcode11:Container With Most Water
题目描述:Container With Most Water
The above vertical lines are represented by array [1,8,6,2,5,4,8,3,7]. In this case, the max area of water (blue section) the container can contain is 49.
更中间的矩形因为离的较近,所以面积大小更依赖高度,而且更依赖两个中较小的高度。所以可以使用双指针法满足限制
解题过程
使用双指针法。
输入数组为height[],则:
i 和 j 构成的矩形的面积=( |j-i| )*min(height[j],height[i])
所以可以看出,面积总是受较短的长度的限制,而且如果两条线段离得越远,则面积越大。
因此想到双指针的方法,初始化left和right,分别指向数组的第一个和最后一个值。
当计算完当前面积后,则可以将指向较短的值的指针向下一个移动。因为,只要向下一个移动,两条线段的距离就会缩短,如果保持较短的指针不变,则高度值抑或等于当前较短的线段,抑或比当前的更短,面积永远不可能比当前值更大。
public int maxArea(int[] height) {
if (height.length<2) {
return 0;
}
int left=0,right=height.length-1;
int max=0;
int area=0;
while (left<right) {
if (height[left]>height[right]) {
area=(right-left)*height[right];
right--;
}
else {
area=(right-left)*height[left];
left++;
}
max=Math.max(area, max);
}
return max;
}
时间复杂度:O(n),一次扫描。
空间复杂度:O(1),使用恒定的空间。
看了题解以后,发现area这个变量可以省略,直接
maxarea = Math.max(maxarea, Math.min(height[l], height[r]) * (r - l));
再进行长短的判定。代码可以更加精简。