给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/container-with-most-water 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
时间: 2023-05-26 14:03:38 浏览: 158
双指针法
首先我们可以想到暴力枚举两条线段,计算它们能组成的最大容量,但这样的时间复杂度为 $O(n^2)$,因此需要考虑更快的方法。
考虑容器的面积受限于两条线段的高度和它们之间的距离,因此我们可以从两端分别选出一条线段,计算它们能组成的最大容量,然后将短的那条线段向内移动,再次计算容量,以此类推,直到两条线段相遇为止。
因为向内移动短线段不会使容器的宽度变大,而容器的高度又受限于短线段,因此向内移动长线段只会使容器的容量更小,因此我们每次移动短线段,以期望能够在较少的比较次数内找到最大的容量。
时间复杂度:$O(n)$
Python 代码
相关问题
给定一个长度为n的整数数组height。有n条垂线,第i条线的两个端点是(i,0)和(i,height[i])。请编写一个函数:找出其中的两条线,使得它们与x轴共同构成的容器可以容纳最多的水。
这是一个经典的双指针问题,可以使用双指针算法来解决。具体来说,我们可以将左指针指向数组的起始位置,右指针指向数组的末尾位置。每次计算当前左指针和右指针所指的区域所能容纳的水的体积,取最大值。然后移动高度较低的那个指针,因为如果移动高度较高的指针,由于宽度变小,容器的容积只会变小而不会变大。
代码示例:
```
int maxArea(vector<int>& height) {
int left = 0, right = height.size() - 1;
int maxArea = 0;
while (left < right) {
int currArea = min(height[left], height[right]) * (right - left);
maxArea = max(maxArea, currArea);
if (height[left] < height[right]) {
left++;
} else {
right--;
}
}
return maxArea;
}
```
给定一个长度为n的整数数组height。有n条垂线,第i条线的两个端点是(, e)和(4, height[11)。 找出其中的两条线,使得它们×轴共同构成的容器可以容纳最多的水。 返回容器可以储存
这是一个经典的计算机科学问题,通常被称为“两杆容积”或“最大面积容器”。给定一个高度数组`height`,我们需要找到两条垂直于x轴的线段,一条从`(0, 0)`开始,另一条从`(4, 0)`开始,并在每个时间步`i`(`0 <= i < n`)放下线,直到它到达`height[i]`的高度。我们的目标是在整个过程中找到能容纳最多水量的区域。
为了求解这个问题,我们可以使用动态规划。创建一个变量`maxArea`来存储当前能找到的最大容积,然后遍历数组`height`。对于每个位置`i`,计算以`i`为下界的左边线段和以`4`为上界右边线段所能形成的最大宽度,即`min(height[i], 4)`,并将这个宽度乘以前面已经累积的高度`maxArea * min(height[:i])`更新到`maxArea`中。最后,`maxArea`就是我们想要的答案。
算法伪代码如下:
```python
def maxArea(height):
maxArea = 0
for i in range(len(height)):
maxArea = max(maxArea, height[i] * (4 - 0))
if i > 0:
maxArea = max(maxArea, (height[i] + height[i-1]) * (4 - i))
return maxArea
```
阅读全文