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 <= 10^5^

0 <= height[i] <= 10^4^

题解

双指针

  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:
cpp 复制代码
#include <iostream>
#include <vector>
#include <algorithm>

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

相关推荐
MinBadGuy1 小时前
【GeekBand】C++设计模式笔记5_Observer_观察者模式
c++·设计模式
自由的dream1 小时前
0-1背包问题
算法
2401_857297911 小时前
招联金融2025校招内推
java·前端·算法·金融·求职招聘
爱上语文1 小时前
Java LeetCode每日一题
java·开发语言·leetcode
良月澪二2 小时前
CSP-S 2021 T1廊桥分配
算法·图论
wangyue43 小时前
c# 线性回归和多项式拟合
算法
&梧桐树夏3 小时前
【算法系列-链表】删除链表的倒数第N个结点
数据结构·算法·链表
QuantumStack3 小时前
【C++ 真题】B2037 奇偶数判断
数据结构·c++·算法
今天好像不上班4 小时前
软件验证与确认实验二-单元测试
测试工具·算法
wclass-zhengge4 小时前
数据结构篇(绪论)
java·数据结构·算法