ArronHC的博客

Back

每日一题:盛最多水的容器Blur image

题目描述#


给定一个长度为 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 <= 105
  • 0 <= height[i] <= 10^4

解题思路#


存水量取决于两根柱子中短的那一根,那么我们现在要做的就是来挑柱子

首先,我们当然希望 x 轴的距离越大越好,所以我们很自然地想到用双指针来解决

把两个指针分别放在最左端和最右端,我们一次挪动一步来找柱子,那么我们挪哪边的柱子呢?

假如我们移动其中较高的那根柱子:

  • 距离缩短了
  • 高度只低不高 假如我们移动其中较矮的那根柱子:
  • 距离缩短了
  • 高度只高不低 所以我们已经得到了策略:移动较矮的那根柱子 每次移动较矮的那一根,找到容量最大的即可

完整代码#

class Solution {

public:

    int maxArea(vector<int>& height) {

        int l = 0, r = height.size()-1;

        int max_volume=-1;

        while(l<r) {

            int h = min(height[l],height[r]);

            int vol = h*(r-l);

            max_volume = max(max_volume,vol);

            if(height[l]<height[r]) l++;

            else r--;

        }

        return max_volume;

    }

};
cpp
每日一题:盛最多水的容器
https://www.arronhc.cyou/blog/%E6%AF%8F%E6%97%A5%E4%B8%80%E9%A2%98%E7%9B%9B%E6%9C%80%E5%A4%9A%E6%B0%B4%E7%9A%84%E5%AE%B9%E5%99%A8
Author ArronHC
Published at 2025年9月25日
Comment seems to stuck. Try to refresh?✨