11. 盛最多水的容器
给定 n 个非负整数 a1,a2,...,an,且 n 的值至少为 2,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
题解:双指针方法
class Solution {
//双指针方法
public int maxArea(int[] height) {
//定义左右双指针,分别为数组的起始点
int maxarea = 0, l = 0, r = height.length - 1;
//当左指针小于右指针时
while (l < r) {
//计算容积最大值
maxarea = Math.max(maxarea,
//计算容积(最短的线*左右指针的间距)
Math.min(height[l], height[r]) * (r - l));
//谁最短谁向内移动
if (height[l] < height[r])
l++;
else
r--;
}
return maxarea;
}
}
复杂度分析
时间复杂度:O(n),一次扫描。
空间复杂度:O(1),使用恒定的空间。
双指针方法的典型用法