首页 > 其他分享 >盛水最多的容器

盛水最多的容器

时间:2024-10-16 18:18:54浏览次数:9  
标签:容器 right area int 盛水 height left 指针

力扣第11题:盛水最多的容器

题目描述

给定一个整数数组 height ,其中 height[i] 表示第 i 条垂线的高度。找出两条线之间可以盛水的最大量,水的容量由较短的线段决定,且取决于这两条线段之间的宽度。

示例

示例 1:

输入:height = [1,8,6,2,5,4,8,3,7]
输出:49

示例 2:

输入:height = [1,1]
输出:1

解题思路

在本题中,我们需要找到能够形成最多水的两条线段。直观的方法是使用双重循环,计算每对线段之间的面积,但这种方法的时间复杂度为 O(n^2),在大数据量情况下效率较低。因此,我们采用双指针(Two Pointer)的方法,以优化我们的解法。

双指针法

  1. 指针初始化:我们使用两个指针 leftright,分别指向数组的开头和结尾。
  2. 面积计算:在每一步中,我们计算当前两条线段之间的面积,并更新 max_area 以保存当前的最大值。
  3. 移动指针:每次比较两个指针指向的线段的高度,移动指向较短线段的指针。这是因为水的容量由较短的线段决定,移动较短线段的指针可能会找到更高的线段,进而增加面积。

这种方法确保我们只遍历数组一次,时间复杂度为 O(n)。

代码实现

#include <stdio.h>

int maxArea(int* height, int heightSize) {
    int left = 0, right = heightSize - 1;
    int max_area = 0;

    while (left < right) {
        int width = right - left;
        int current_height = height[left] < height[right] ? height[left] : height[right];
        int current_area = current_height * width;
        max_area = max_area > current_area ? max_area : current_area;

        // 移动指向较短线段的指针
        if (height[left] < height[right]) {
            left++;
        } else {
            right--;
        }
    }

    return max_area;
}

int main() {
    int height[] = {1, 8, 6, 2, 5, 4, 8, 3, 7};
    int size = sizeof(height) / sizeof(height[0]);
    printf("Maximum area: %d\n", maxArea(height, size)); // 输出:49
    return 0;
}

代码解释

  • maxArea 函数:该函数接受一个整型数组 height 以及其大小 heightSize,返回能够盛水的最大面积。
  • 双指针法实现
    • 初始化左右指针和最大面积变量。
    • 在循环中计算当前面积,并通过条件判断更新最大面积。
    • 根据高度的比较,调整指针位置以继续寻找可能的最大面积。
  • 主函数:测试该算法并打印结果,以验证其有效性。

总结

通过双指针法,我们可以有效地解决盛水最多的容器问题,时间复杂度降低至 O(n)。该方法的优势在于空间复杂度为 O(1),不需要额外的存储空间。这种优化策略在实际应用中具有重要的价值,尤其是在处理大型数据集时。


希望这篇文章对你理解盛水最多的容器问题有所帮助,欢迎大家在评论区交流心得与体会!

标签:容器,right,area,int,盛水,height,left,指针
From: https://blog.csdn.net/weixin_48941116/article/details/142988676

相关文章

  • springboot使用自定义注解将对象注入容器中
    在SpringBoot中,你可以通过自定义注解和Spring的`BeanPostProcessor`来将对象注入到Spring容器中。以下是一个简单的实现步骤:1.**创建自定义注解**:importjava.lang.annotation.ElementType;importjava.lang.annotation.Retention;importjava.lang.annotation.Reten......
  • 【C++】C++ STL 树形结构容器全解析:map、set、multimap、multiset 的使用与区别
    C++语法相关知识点可以通过点击以下链接进行学习一起加油!命名空间缺省参数与函数重载C++相关特性类和对象-上篇类和对象-中篇类和对象-下篇日期类C/C++内存管理模板初阶String使用String模拟实现Vector使用及其模拟实现List使用及其模拟实现容器适配器Stack与QueuePriority......
  • c++不同容器之间的转换
    在C++中,不同容器之间的转换主要依赖于标准库的迭代器。大部分标准容器提供了兼容的构造函数或函数接口来从其他容器转换或初始化数据。下面是几种常见容器的转换方式:1.vector到set的转换#include<iostream>#include<vector>#include<set>intmain(){std::vec......
  • docker 容器指定utf-8编码,解决中文乱码
    在运行Docker容器的时候,如果容器内应用需要使用UTF-8编码来正常处理中文,你可以通过设置环境变量来指定编码。可以使用-e或者--env标志来设置环境变量。比如,设置LANG和LC_ALL环境变量为C.UTF-8或者en_US.UTF-8:dockerrun-eLANG=C.UTF-8-eLC_ALL=C.UTF-8-it<......
  • Docker 指令详解:全面掌握容器化管理工具
    Docker是当前最流行的容器化平台之一,它通过轻量级的虚拟化技术,让开发者能够快速构建、部署和管理应用。掌握Docker的基础指令对于有效使用这一工具至关重要。本文将详细介绍Docker的常用命令,帮助你全面了解和运用Docker。目录Docker基础概念Docker镜像管理命令do......
  • 【云原生技术】Docker容器进阶知识
    文章目录namespace概述一、namespace的基本概念二、namespace的主要作用三、namespace的类型四、namespace的操作五、namespace在容器技术中的应用cgroup一、cgroup的基本概念二、cgroup的主要功能三、cgroup的子系统介绍四、cgroup的应用场景五、cgroup的使用与管理cg......
  • 修改Docker镜像和容器的默认存储目录(迁移原有数据)
    docker根目录占用的磁盘空间太大,将其迁移到新的磁盘上,后续的镜像和容器存储空间将在新的磁盘上1、查看docker现有的存储目录dockerinfo在打印的信息中查看DockerRootDir,即为当前的根目录,默认是/var/lib/docker,如下图:2、查看docker的service位置systemctlstatusdocker.s......
  • Docker中Mysql容器内如何执行SQL文件?
    Docker中Mysql容器内如何执行SQL文件?查看当前运行的容器dockerps拷贝sql文件到mysql容器中sudodockercp/root/sqlfile/423d23129a6b:/home/temp将sqlfile文件夹下的init.sql数据库拷贝到【423d23129a6b容器】下的/home/temp/文件夹下。进入mysql容器内部dockerex......
  • docker入门(二)之容器命令及私有仓库的部署(本地和harbor)
    容器命令:1.启动容器接下来演示在docker下运行一个ubuntu系统,从中学习各容器命令。--name="容器新名字"为容器指定一个名称(不指定的话会随机分配一个名字)。-d:后台运行容器并返回容器ID,也就启动守护式容器(后台运行)-i:以交互模式运行容器,通常与-t同时使用-t:为......
  • docker容器化.NET程序
    C#使用docker容器化程序创建dockerfile单项目应用:如果你的应用只有一个.csproj文件,建议将Dockerfile放在该.csproj文件所在目录,这样更加简单、清晰,且易于维护。多项目解决方案:如果你的项目有多个子项目,并且你希望构建整个解决方案或特定的子项目,建议将Dockerfile......