给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明:你不能倾斜容器。请给出代码
时间: 2023-09-09 15:05:32 浏览: 229
### 回答1:
这个问题可以用双指针法解决。首先,设置两个指针 left 和 right,分别指向数组的头部和尾部。然后,比较 height[left] 和 height[right] 的高度,将较小的那个指针向中间移动一位,并计算容积。重复上述步骤,直到 left 和 right 指针重合,即可得到最大的容积。
代码如下:
int maxArea(int height[], int n) {
int left = 0, right = n - 1;
int maxArea = 0;
while (left < right) {
int area = min(height[left], height[right]) * (right - left);
maxArea = max(maxArea, area);
if (height[left] < height[right])
left++;
else
right--;
}
return maxArea;
}
### 回答2:
假设左边界为i,右边界为j,则容器的容量是min(height[i], height[j]) * (j - i)。我们可以使用双指针的方法来解决这道问题。
具体步骤如下:
1. 初始化左指针i为0,右指针j为n-1,初始化最大容量max_area为0。
2. 当i小于j时,进行以下操作:
- 计算当前容量area = min(height[i], height[j]) * (j - i);
- 将max_area更新为max(max_area, area);
- 如果height[i]小于height[j],则将i右移一位,否则将j左移一位。
3. 返回max_area。
以下是代码实现:
```
class Solution:
def maxArea(self, height: List[int]) -> int:
i, j = 0, len(height) - 1
max_area = 0
while i < j:
area = min(height[i], height[j]) * (j - i)
max_area = max(max_area, area)
if height[i] < height[j]:
i += 1
else:
j -= 1
return max_area
```
该算法的时间复杂度为O(n),其中n为数组的长度。
### 回答3:
题目要求找出能够容纳最多水量的两条垂线,可以使用双指针法来解决。
设置左指针left为0,右指针right为n-1,然后循环执行以下操作:
1. 计算当前容器的水量,即(右指针-左指针) * min(height[left], height[right]),并更新最大水量max_area;
2. 如果左指针对应的垂线的高度小于右指针对应的垂线的高度,则左指针右移一位;
3. 否则,右指针左移一位。
最终返回最大水量max_area即可。
下面是使用Python代码实现:
```python
def max_area(height):
left = 0
right = len(height) - 1
max_area = 0
while left < right:
area = (right - left) * min(height[left], height[right])
max_area = max(max_area, area)
if height[left] < height[right]:
left += 1
else:
right -= 1
return max_area
```
时间复杂度为O(n),其中n为数组的长度。
阅读全文