力扣 - 11. 盛最多水的容器
题目
思路1(暴力破解)
- 迭代每两个组合
- 找到最大值并输出
题解
class Solution {
public int maxArea(int[] height) {
int ans= 0;
for (int i = 0; i < height.length - 1; i++) {
for (int j = i + 1; j < height.length; j++) {
// 得到最都短的垂直线
int min = Math.min(height[i], height[j]);
// 计算最大的容量
ans= Math.max(ans, min * (j - i));
}
}
return ans;
}
}
复杂度分析
- 时间复杂度:O(N²)
- 空间复杂度:O(1)
思路2(双指针)
- 从两边开始向内移动,计算两边组合水容量
- 每次比较只移动短边,等长移动任意一边,当两边重合时结束
题解
public class Solution {
public int maxArea(int[] height) {
int l = 0, r = height.length - 1;
int ans = 0;
while (l < r) {
// 计算两边组合的水容量
int area = Math.min(height[l], height[r]) * (r - l);
// 取较大一方
ans = Math.max(ans, area);
// 移动短边下标,等长则移动左边
if (height[l] <= height[r]) {
++l;
}
else {
--r;
}
}
return ans;
}
}
总结
如果我们移动数字较大的那个指针,那么前者「两个指针指向的数字中较小值」不会增加,后者「指针之间的距离」会减小,那么这个乘积会减小。
因此,我们移动数字较大的那个指针是不合理的。因此,我们移动 数字较小的那个指针。
复杂度分析
- 时间复杂度:O(N)
- 空间复杂度:O(1)