• LeetCode 算法:盛最多水的容器c++


    原题链接🔗盛最多水的容器
    难度:中等⭐️⭐️

    题目

    给定一个长度为 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] <= 104

    题解

    双指针

    1. 题解

    LeetCode上的“盛最多水的容器”问题是一个典型的双指针问题,它要求你找到一个容器的形状,使得其盛水的体积最大。容器的形状由一个整数数组表示,其中每个元素代表容器在该位置的宽度。
    这个问题可以通过以下逻辑来解决:

    • 初始化指针:设置两个指针 left 和 right,分别指向数组的开始和结束位置。

    • 计算面积:在每一步中,计算两个指针之间的面积。面积可以通过 min(height[left], height[right]) * (right - left) 来计算,其中 min(height[left], height[right]) 是两个指针中较小的高度,(right - left) 是两个指针之间的宽度。

    • 更新最大面积:将当前面积与之前记录的最大面积进行比较,并更新最大面积。

    • 移动指针:移动 left 或 right 指针以尝试找到更大的面积。选择移动哪个指针取决于 height[left] 和 height[right] 的值。如果 height[left] < height[right],则移动 left 指针,因为移动较短的边可以更快地尝试新的高度。反之,则移动 right 指针。

    • 循环结束条件:当 left 和 right 指针相遇时,循环结束。

    • 返回结果:返回记录的最大面积。

    这个算法的关键在于理解,移动较短边的指针可以更快地探索新的高度,因为容器的面积由两个因素决定:宽度和高度。当宽度固定时,高度越小,面积越小。因此,通过移动较短边的指针,我们可以更快地找到可能的更大面积。

    1. 复杂度:时间复杂度O(N),空间复杂度O(1)。
    2. 代码过程:
    • 初始化两个指针 left 和 right 分别指向数组的开始和结束位置。
    • 在 while 循环中,计算当前面积 width *min(height[left], height[right]),其中 width 是两个指针之间的距离,min(height[left], height[right]) 是容器在当前指针位置的最小高度。
    • 更新 max_area 为当前面积和已知最大面积之间的较大值。
    • 移动较短边的指针,因为移动较长边的指针不会增加面积。
    • 当两个指针相遇时,循环结束。
    1. c++ demo:
    #include 
    #include 
    #include 
    
    using namespace std;
    
    int maxArea(vector<int>& height) {
        int max_area = 0;
        int left = 0;
        int right = height.size() - 1;
    
        while (left < right) {
            int width = right - left;
            int current_area = width * min(height[left], height[right]);
            max_area = max(max_area, current_area);
    
            if (height[left] < height[right]) {
                left++;
            }
            else {
                right--;
            }
        }
    
        return max_area;
    }
    
    int main() {
        // 示例输入
        vector<int> height1 = { 1,8,6,2,5,4,8,3,7 };
        vector<int> height2 = { 1,1,1 };
    
        // 调用 maxArea 函数并打印结果
        cout << "Maximum water that can be trapped with height1: " << maxArea(height1) << endl;
        cout << "Maximum water that can be trapped with height2: " << maxArea(height2) << endl;
    
        return 0;
    }
    
    • 输出结果:

    Maximum water that can be trapped with height1: 49
    Maximum water that can be trapped with height2: 2
    在这里插入图片描述

  • 相关阅读:
    java语言【#87. 矩形的面积与周长】(已通过)
    一文看懂Camera request、buffer、stream、surface关系 独家原创
    (202402)多智能体MetaGPT入门1:MetaGPT环境配置
    【python深度学习】——torch.min()
    接口测试 —— Jmeter 之测试片段的应用
    建设现代智能工业-智能化、数字化、自动化节能减排
    JAVA题库——关于java中的方法
    利用在线培训系统提升员工技能,助力企业发展
    509.斐波那契数 | 322.零钱兑换
    C语言中的 int main(int argc,char const *argv[])是什么意思?
  • 原文地址:https://blog.csdn.net/yanceyxin/article/details/139381447