算法探秘:盛最多水的容器问题

目录

一、问题引入 

二、示例剖析 

三、暴力解法与困境 

四、双指针法:优雅的解决方案 

五、总结 


一、问题引入


在算法的奇妙世界里,常常会遇到各种有趣又富有挑战性的问题,“盛最多水的容器”就是其中之一。想象一下,有一系列垂直排列的线段,它们与  x  轴共同构成了一个个容器,我们的任务是找出其中能够容纳最多水的那个容器。具体来说,给定一个长度为  n  的整数数组  height ,第  i  条线的两个端点是  (i, 0)  和  (i, height[i]) ,我们要找出其中两条线,使它们与  x  轴构成的容器能容纳最多的水,而且容器不能倾斜哦。
 


二、示例剖析
 

先来看两个具体的例子,这样能让我们对问题有更直观的感受。
 
示例1
 
输入数组为  [1,8,6,2,5,4,8,3,7]  ,在这种情况下,容器能够容纳水的最大值为  49  。从对应的示意图中可以看到,不同竖线构成的容器,其容量是不一样的,我们要找的就是其中最大的那个容量。

 示例2

输入数组为  [1,1]  ,此时输出的最大容量为  1  。通过这两个简单的例子,相信你已经对问题有了初步的理解。
 


三、暴力解法与困境

int cmp(const void*e1,const void*e2)
{return *(int*)e1-*(int*)e2;
}int maxarea(int* height, int heightSize)
{int sum=heightSize-1+(heightSize-1)*(heightSize-2)/2;int*arr=(int*)malloc(sizeof(int)*sum);int input=0;for(int i=0;i<heightSize-1;i++){for(int j=heightSize-1;j>i;j--){int temp=height[i]<height[j]?height[i]:height[j];int mul=temp*(j-i);arr[input]=mul;input++;}}qsort(arr,sum,sizeof(int),cmp);return arr[sum-1];
}


刚开始接触这个问题时,很容易想到暴力枚举的方法。通过两层循环,遍历所有可能的两条线段组合,计算它们构成的容器的容量,然后找出最大值。图中右侧的代码就是一种暴力枚举的实现方式。它先计算出所有可能组合的数量  sum  ,然后使用两层循环遍历数组,计算每对线段构成的容器容量并存储在数组  arr  中,最后对数组排序并返回最大值。
 
但是,这种方法存在一个很大的问题,那就是时间复杂度较高,为 O(n^2) 。当数组规模较大时,程序运行的时间会变得非常长,甚至可能出现超时的情况,这显然不是我们想要的结果。
 

四、双指针法:优雅的解决方案
 

为了降低时间复杂度,我们可以采用双指针法。这种方法就像是一场有趣的“指针舞蹈”,让两个指针从数组的两端向中间移动,逐步找到最大容量的容器。
 
具体代码如下:
 

c#include <stdio.h>int maxArea(int* height, int heightSize) {int left = 0;int right = heightSize - 1;int max_area = 0;while (left < right) {int area = (right - left) * ((height[left] < height[right]) ? height[left] : height[right]);if (area > max_area) {max_area = area;}if (height[left] < height[right]) {left++;} else {right--;}}return max_area;
}


 
代码开始时,定义两个指针  left  和  right  分别指向数组的起始和末尾位置,同时初始化最大容量  max_area  为  0  。在循环中,每次计算当前指针所指线段构成的容器容量  area  ,如果这个容量大于当前记录的最大容量  max_area  ,就更新  max_area  。然后,根据两条线段的高度情况,将较矮的那条线段对应的指针向中间移动,直到两个指针相遇,此时返回记录的最大容量  max_area  。
 
双指针法的时间复杂度为 O(n) ,相比暴力枚举法,效率有了显著提升。因为两个指针从两端向中间移动,最多遍历一次数组,大大减少了计算量。
 

五、总结
 


“盛最多水的容器”问题看似简单,却蕴含着丰富的算法思想。从暴力枚举的直观思路到双指针法的巧妙优化,我们不仅学会了解决这个具体的问题,更重要的是掌握了不同算法的特点和应用场景。在未来面对其他算法问题时,也可以借鉴这种从简单到优化的思考方式,不断探索更高效的解决方案,在算法的海洋中畅游,发现更多的乐趣和奥秘。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/28910.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QTday4

1:是进度条通过线程自己动起来 mythread.h #ifndef MYTHREAD_H #define MYTHREAD_H #include <QThread>class mythread : public QThread {Q_OBJECT public:mythread(QObject* parent nullptr); protected:virtual void run() override; private: signals:virtual voi…

PPT小黑第26套

对应大猫28 层次级别是错的&#xff0c;看着是十页&#xff0c;导入ppt之后四十多页 选中所有 红色蓝色黑色 文本选择标题&#xff1a;选择 -格式相似文本&#xff08;检查有没有漏选 漏选的话 按住ctrl 点下一个&#xff09; 要求新建幻灯片中不包含原素材中的任何格式&…

transformer架构解析{掩码,(自)注意力机制,多头(自)注意力机制}(含代码)-3

目录 前言 掩码张量 什么是掩码张量 掩码张量的作用 生成掩码张量实现 注意力机制 学习目标 注意力计算规则 注意力和自注意力 注意力机制 注意力机制计算规则的代码实现 多头注意力机制 学习目标 什么是多头注意力机制 多头注意力计算机制的作用 多头注意力机…

Spring编写单元测试的工具介绍:JUnit、Mockito、AssertJ

背景&#xff1a; 在Spring应用程序中&#xff0c;想要通过代码走查做好测试左移&#xff0c;单元测试是确保代码质量和功能正确性的关键。除了我们常用的TestNG外&#xff0c;本次介绍一下其他常见的单元测试工具: JUnit、Mockito、AssertJ&#xff0c;来提高我们做白盒测试的…

Kubermetes 部署mysql pod

步骤 1: 创建 PersistentVolume 和 PersistentVolumeClaim 首先为 MySQL 创建一个 PersistentVolume (PV) 和 PersistentVolumeClaim (PVC) 来确保数据的持久性。 mysql-pv.yaml&#xff1a; apiVersion: v1 kind: PersistentVolume metadata:name: mysql-pv-volume spec:cap…

论坛社区基础版【项目测试报告】

文章目录 一、项目背景二、项目功能用户注册/登录帖子列表页发布帖子个人中心 三、测试工具和环境四、测试计划非功能测试用例功能测试用例部分人工手动测试截图web自动化测试测试用例代码框架 配置内容代码文件&#xff08;Utils.py&#xff09;注册页面代码文件&#xff08;R…

物联网IoT系列之MQTT协议基础知识

文章目录 物联网IoT系列之MQTT协议基础知识物联网IoT是什么&#xff1f;什么是MQTT&#xff1f;为什么说MQTT是适用于物联网的协议&#xff1f;MQTT工作原理核心组件核心机制 MQTT工作流程1. 建立连接2. 发布和订阅3. 消息确认4. 断开连接 MQTT工作流程图MQTT在物联网中的应用 …

如何面向DeepSeek编程,打造游戏开发工具集,提升工作效率

最近我在思考&#xff1a; 如何基于DeepSeek&#xff0c;来提升工作效率&#xff0c;构建高效游戏开发工作流。 方向有两个: A: 基于DeepSeek私有代码框架&#xff0c;让它完成项目代码的续写; B: 基于DeepSeek来创作一些工具&#xff0c;使用工具来提升效率&#xff0c;如…

云原生机密计算:构建基于可信执行环境的数据安全堡垒

引言&#xff1a;数据计算的最后一道防线 蚂蚁集团金融级机密计算平台承载日均20亿次敏感交易&#xff0c;密钥泄露风险降低99.97%。微软Azure DCsv3系列虚拟机实现SGX全内存加密性能损耗<15%&#xff0c;Google Anthos Confidential将跨云数据传输成本压缩45%。Gartner预测…

通用文件模型

一、通用文件模型 通常一个完整的Linux系统有数千到数百万个文件组成&#xff0c;文件中存储了程序、数据和各种信息。层次化的目录结构用于对文件进行编排和分组。 1.ReiserFS(新型的文件系统) -->Reiser4 它通过一种与众不同的方式----完全平衡树来容纳数据&#xff0c;包…

产品管理过程-思维导图

产品管理过程 1. 市场调研 与用户交流与直接面对客户的一线同事如销售、客服、技术支持等交流市场研究报告分析竞争对手分析用户数据分析 2. 需求管理 需求来源管理 市场需求内部需求运营需求战略需求其它需求 需求版本管理 需求分配管理 需求跟踪管理 3. 产品规划 市…

EtherNet/IP转Modbus解析基于网关模块的罗克韦尔PLC与Modbus上位机协议转换通讯案例

在工业自动化控制系统中&#xff0c;常常会遇到不同品牌和通信协议的设备需要协同工作的情况。本案例中&#xff0c;客户现场采用了 AB PLC&#xff0c;但需要控制的变频器仅支持 Modbus 协议。为了实现 AB PLC 对变频器的有效控制与监控&#xff0c;引入了捷米特 JM-EIP-RTU 网…

【进程和线程】(面试高频考点)

【进程和线程】 前言 在计算机编程领域&#xff0c;并发编程是一项至关重要的技术&#xff0c;而进程和线程正是实现并发编程的核心概念。为了让大家更直观地理解并发编程的作用&#xff0c;我们先来看一个简单的生活例子。 想象一下&#xff0c;现在有一大份美味的饭菜&…

HTML 编辑器推荐与 VS Code 使用教程

在进行 HTML 编程时&#xff0c;选择一款合适的 HTML 编辑器能极大地提高开发效率。以下为大家推荐几款常用且功能强大的 HTML 编辑器&#xff0c;同时详细介绍如何使用 VS Code 创建和预览 HTML 文件。 一、HTML 编辑器推荐 VS Code&#xff1a;由微软开发&#xff0c;是一款…

Kubernetes开发环境minikube | 开发部署apache tomcat web集群应用

minikube是一个主要用于开发与测试Kubernetes应用的运行环境&#xff0c;本文主要描述在minikube运行环境中部署J2EE tomcat web应用。 单节点Node多Pod实例部署 如上所示&#xff0c;在minikube运行的Linux部署环境中启动单节点Node 如上所示&#xff0c;在minikube的容器环境…

STM32---FreeRTOS中断管理试验

一、实验 实验目的&#xff1a;学会使用FreeRTOS的中断管理 创建两个定时器&#xff0c;一个优先级为4&#xff0c;另一个优先级为6&#xff1b;注意&#xff1a;系统所管理的优先级范围 &#xff1a;5~15 现象&#xff1a;两个定时器每1s&#xff0c;打印一段字符串&#x…

永磁直驱式风力发电虚拟同步机仿真模型Matlab/Simulink模型

很久没有分享虚拟同步机控制相关的方向了&#xff0c;毕业后在电科院的项目又有所接触。这个课题方向其实作为硕士毕业课题还是够用的&#xff0c;相对来说也是比较容易毕业的&#xff0c;因为涉及的分支比较多。 后续对虚拟同步机的控制&#xff0c;我就延续我前面博客提到的方…

图像分类项目1:基于卷积神经网络的动物图像分类

1、选题背景及动机 在现代社会中&#xff0c;图像分类是计算机视觉领域的一个重要任务。动物图像分类具有广泛的应用&#xff0c;例如生态学研究、动物保护、农业监测等。通过对动物图像进行自动分类&#xff0c;可以帮助人们更好地了解动物种类、数量和分布情况&#xff0c;从…

Vue 3 整合 WangEditor 富文本编辑器:从基础到高级实践

本文将详细介绍如何在 Vue 3 项目中集成 WangEditor 富文本编辑器&#xff0c;实现图文混排、自定义扩展等高阶功能。 一、为什么选择 WangEditor&#xff1f; 作为国内流行的开源富文本编辑器&#xff0c;WangEditor 具有以下优势&#xff1a; 轻量高效&#xff1a;压缩后仅…

Ansys Zemax | 使用衍射光学器件模拟增强现实 (AR) 系统的出瞳扩展器 (EPE):第 4 部分

附件下载 联系工作人员获取附件 在 OpticStudio 中使用 RCWA 工具为增强现实&#xff08;AR&#xff09;系统设置出瞳扩展器&#xff08;EPE&#xff09;的示例中&#xff0c;首先解释了k空间中光栅的规划&#xff0c;并详细讨论了设置每个光栅的步骤。 介绍 本文是该四篇文…