11. 盛最多水的容器[中等]✅
·
11. 盛最多水的容器
题目:给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。

思路:采用 双指针 + 贪心。
核心思想:
容器面积由 宽度 × 最短高度 决定,移动较短的一边,才可能找到更大的面积。
具体过程:
-
定义左右指针,分别指向数组两端。
-
计算当前容器面积:
-
宽度:
right - left -
高度:
Math.min(height[left], height[right])
-
-
更新最大面积。
-
移动较矮的一侧:
-
如果左边矮,
left++ -
如果右边矮,
right--
-
时间复杂度: O(n)
空间复杂度: O(1)
class Solution {
public int maxArea(int[] height) {
int ans = 0;
int left = 0;
int right = height.length - 1;
while (left < right) {
int area = (right - left) * Math.min(height[left], height[right]);
ans = Math.max(ans, area);
if (height[left] < height[right]) {
// height[left] 与右边的任意垂线都无法组成一个比 ans 更大的面积
left++;
} else {
// height[right] 与左边的任意垂线都无法组成一个比 ans 更大的面积
right--;
}
}
return ans;
}
}
可参考思路讲解【leetcode hot100】 11、盛最多水的容器 | 双指针的本质(动画讲解)_哔哩哔哩_bilibili
更多推荐

所有评论(0)