每日一题:每天一个新挑战;
循序渐进:从易到难,扎实掌握;
系统分类:按数据结构分类,有助于构建知识框架;
丰富题量:100 道精选题,覆盖简单/中等/困难难度。
给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。
找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。
说明:你不能倾斜容器。
示例 1:
输入:[1,8,6,2,5,4,8,3,7]
输出:49
解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。
示例 2:
输入:height = [1,1]
输出:1
提示:
- n == height.length
- 2 <= n <= 10^5
- 0 <= height[i] <= 10^4
代码卡片

题目解析
给定一个整数数组 height,数组中的每个元素代表垂线的高度。要求在这些垂线中找到两条,使它们与 x 轴构成的容器能够容纳最多的水。注意容器不能倾斜,也就是说,水量的计算是基于两条垂线之间的最短高度和它们之间的距离。
方法一:双指针法
使用双指针法解决该问题。初始时,一个指针放在数组的起始位置,另一个指针放在数组的末尾。计算它们之间构成的容器的面积,然后移动高度较小的指针,向内收缩,继续计算新的面积,并不断更新最大面积,直到两个指针相遇。
- 初始化两个指针 left 和 right,分别指向数组的头和尾。
- 计算由 height[left] 和 height[right] 构成的容器的面积。
- 如果 height[left] < height[right],则移动 left 指针,否则移动 right 指针。
- 不断更新最大面积,直到 left 和 right 指针相遇。
- 返回最大的面积。
- 时间复杂度: O(n),其中 n 是数组的长度。算法只需要遍历一次数组,因此时间复杂度是线性的。
- 空间复杂度: O(1),只使用了常数级别的额外空间。
var maxArea = function(height) {
let left = 0;
let right = height.length - 1;
let maxArea = 0;
while (left < right) {
const currentArea = Math.min(height[left], height[right]) * (right - left);
maxArea = Math.max(maxArea, currentArea);
if (height[left] < height[right]) {
left++;
} else {
right--;
}
}
return maxArea;
};
总结
双指针法通过移动指针来缩小搜索范围,并且能够在 O(n) 的时间复杂度内找到最大的容器面积。
发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/288985
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!