> 文章列表 > 【leetcode hot 100】【7】11. 盛最多水的容器

【leetcode hot 100】【7】11. 盛最多水的容器

【leetcode hot 100】【7】11. 盛最多水的容器

题目

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

示例 1:

【leetcode hot 100】【7】11. 盛最多水的容器

输入:[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 <= 105
  • 0 <= height[i] <= 104

解题思路

这个问题可以通过使用双指针法来解决。双指针法的基本思想是,使用两个指针分别指向容器的两侧边界,然后根据高度较小的一侧向内移动,从而找到可能的最大水容量。具体步骤如下:

  • 1.初始化两个指针,一个指向数组的开头 (left),一个指向数组的末尾 (right)。
  • 2.计算当前两个指针指向的容器的水容量,即 min(height[leftl, height[right])*(right - left)。
  • 3.更新最大水容量,如果当前水容量大于之前的最大水容量。
  • 4.比较两侧边界的高度,将高度较小的一侧向内移动一步。
  • 5.重复步骤2-4,直到两个指针相遇。

最后,返回最大水容量作为结果。

代码

c++

class Solution {
public:int maxArea(vector<int>& height) {int left = 0; // 左边界指针int right = height.size() - 1; // 右边界指针int max_area = 0; // 最大水容量while (left < right) { // 当左边界指针小于右边界指针时循环int h = min(height[left], height[right]); // 当前容器的高度取决于较小的一侧int w = right - left; // 当前容器的宽度int area = h * w; // 当前容器的水容量max_area = max(max_area, area); // 更新最大水容量if (height[left] < height[right]) { // 如果左边界的高度小于右边界的高度,则将左边界向右移动一步left++;} else { // 否则将右边界向左移动一步right--;}}return max_area; // 返回最大水容量作为结果}
};

golang

func maxArea(height []int) int {left := 0 // 左边界指针right := len(height) - 1 // 右边界指针maxArea := 0 // 最大水容量for left < right { // 当左边界指针小于右边界指针时循环h := min(height[left], height[right]) // 当前容器的高度取决于较小的一侧w := right - left // 当前容器的宽度area := h * w // 当前容器的水容量if area > maxArea { // 更新最大水容量maxArea = area}if height[left] < height[right] { // 如果左边界的高度小于右边界的高度,则将左边界向右移动一步left++} else { // 否则将右边界向左移动一步right--}}return maxArea // 返回最大水容量作为结果
}func min(a, b int) int { // 辅助函数,返回两者中较小的数if a < b {return a}return b
}