当前位置: 面试刷题>> 盛最多水的容器(经典算法150题)
### 题目描述
给定 `n` 个非负整数 `a1, a2, ..., an`,每个数代表坐标中的一个点 `(i, ai)`。在坐标内画 `n` 条垂直线,使得第 `i` 条线过点 `(i, ai)`。找出其中的两条线,使得它们与 `x` 轴共同构成的容器可以容纳最多的水。
**注意**:你不能倾斜容器,且 `n` 至少为 2。
### 示例
给定数组 `[1,8,6,2,5,4,8,3,7]`,在这个例子中,垂直线分别表示为数组 `[1,8,6,2,5,4,8,3,7]`。在此情况下,容器能容纳水最多的组合是高度为 1 和 8 的两个垂直线(即位于索引 0 和索引 1 的两个点),此时容器的面积为 `(8 - 1) * min(1, 8) = 7 * 1 = 7`。
### 解题思路
这个问题可以使用双指针法来解决。初始化两个指针,一个指向数组的开始位置,另一个指向数组的结束位置。计算当前两个指针所指向的垂直线构成的容器的面积,并更新最大面积。然后,移动高度较小的那个指针向中间移动(因为移动高度较大的指针不会增加容器的面积,反而可能减小),继续计算并更新最大面积,直到两个指针相遇。
### PHP 代码示例
```php
function maxArea($height) {
$maxArea = 0;
$left = 0;
$right = count($height) - 1;
while ($left < $right) {
$area = min($height[$left], $height[$right]) * ($right - $left);
$maxArea = max($maxArea, $area);
if ($height[$left] < $height[$right]) {
$left++;
} else {
$right--;
}
}
return $maxArea;
}
// 示例
$height = [1,8,6,2,5,4,8,3,7];
echo maxArea($height); // 输出 49
```
### Python 代码示例
```python
def maxArea(height):
max_area = 0
left, right = 0, len(height) - 1
while left < right:
area = min(height[left], height[right]) * (right - left)
max_area = max(max_area, area)
if height[left] < height[right]:
left += 1
else:
right -= 1
return max_area
# 示例
height = [1,8,6,2,5,4,8,3,7]
print(maxArea(height)) # 输出 49
```
### JavaScript 代码示例
```javascript
function maxArea(height) {
let maxArea = 0;
let left = 0;
let right = height.length - 1;
while (left < right) {
const area = Math.min(height[left], height[right]) * (right - left);
maxArea = Math.max(maxArea, area);
if (height[left] < height[right]) {
left++;
} else {
right--;
}
}
return maxArea;
}
// 示例
const height = [1,8,6,2,5,4,8,3,7];
console.log(maxArea(height)); // 输出 49
```
以上代码示例均实现了盛最多水的容器的算法,并给出了示例输入和输出。希望这能帮助你理解并解答这个问题。