c++算法学习,最大区间

给定一个实数序列,设计一个最有效的算法,找到一个总和数最大的区间 

#include <iostream>
#include <vector>
#include <limits>// 结果结构体,用于存储最大子数组的信息
struct Result {int maxSum; // 最大和int start;  // 子数组的起始索引int end;    // 子数组的结束索引
};// 查找最大子数组的函数,基于 Kadane 算法
Result findMaxSubarray(const std::vector<double>& arr) {double maxSoFar = std::numeric_limits<double>::lowest(); // 初始化最大和为负无穷double maxEndingHere = 0; // 当前子数组的和int start = 0, end = 0, s = 0; // 记录最大子数组的起始和结束索引Result result; // 创建结果对象result.maxSum = 0; // 初始化结果的最大和为0result.start = 0; // 初始化结果的起始索引为0result.end = 0; // 初始化结果的结束索引为0for (int i = 0; i < arr.size(); i++) {maxEndingHere += arr[i]; // 将当前元素加入当前子数组和if (maxSoFar < maxEndingHere) {maxSoFar = maxEndingHere; // 更新最大和start = s; // 更新起始索引end = i; // 更新结束索引}if (maxEndingHere < 0) {maxEndingHere = 0; // 如果当前子数组和为负数,重新开始计算子数组和s = i + 1; // 更新起始索引}}result.maxSum = maxSoFar; // 将最大和存入结果对象result.start = start; // 将起始索引存入结果对象result.end = end; // 将结束索引存入结果对象return result; // 返回结果对象
}int main() {std::vector<double> arr = {-2.0, 1.0, -3.0, 4.0, -1.0, 2.0, 1.0, -5.0, 4.0};Result result = findMaxSubarray(arr);std::cout << "最大连续子数组的和为 " << result.maxSum << std::endl;std::cout << "起始索引: " << result.start << std::endl;std::cout << "结束索引: " << result.end << std::endl;return 0;
}

算法思想:

  1. Kadane算法的核心思想是动态规划。我们通过一次遍历数组就能找到最大子数组和。
  2. 我们维护两个变量:
    • maxSoFar:到目前为止找到的最大子数组和
    • maxEndingHere:以当前元素结尾的最大子数组和
  3. 对于每个元素,我们有两个选择:
    • 将当前元素加入到现有的子数组中
    • 开始一个新的子数组
  4. 如果maxEndingHere变为负数,我们就重置它为0,因为没有理由保留一个负的子数组和。
  5. 我们还跟踪最大子数组的起始和结束索引。

代码解释:

  1. 我们定义了一个Result结构来存储最大和及其对应的起始和结束索引。
  2. findMaxSubarray函数实现了Kadane算法:
    • 初始化maxSoFar为最小的可能值,maxEndingHere为0。
    • 遍历数组,更新maxEndingHeremaxSoFar
    • 当找到一个新的最大和时,更新起始和结束索引。
    • 如果maxEndingHere变为负数,重置它并更新潜在的新起始索引。
  3. main函数中,我们展示了如何使用这个算法。

这个算法的时间复杂度是O(n),其中n是数组的长度,因为我们只需要遍历数组一次。空间复杂度是O(1),因为我们只使用了常数额外空间。

这个算法非常高效,它能在一次遍历中找到最大子数组和,而不需要考虑所有可能的子数组(这将需要O(n^2)的时间复杂度)。

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

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

相关文章

49-5 内网渗透 - 服务注册表权限脆弱提权

一、服务注册表权限脆弱提权介绍 Windows操作系统中的注册表存储了每个系统服务的相关条目。注册表使用访问控制列表(ACL)来管理用户对其条目的访问权限。如果注册表的ACL配置不正确,可能导致低权限用户获得对服务注册表的写入权限。攻击者可以利用这一漏洞修改注册表内容,…

【android 9】【input】【9.发送按键事件3——Inputchannel的创建过程】

系列文章 本人系列文章-CSDN博客 目录 系列文章 目录 1.简介 1.1 主要步骤 1.2 时序图 2.源码分析 2.1 WindowManagerImpl的addView 2.2 WindowManagerGlobal的addView 2.3 ViewRootImpl 2.4 getWindowSession 2.5 WMS中的openSession 2.6 Session 2.7 class W 2.…

java周测总结(3)

1、什么是I0流&#xff1f; 是一串流动的字符,从先进先出的方式要求信息的通道。 2、什么是序列化&#xff1f;什么是反序列化&#xff1f; 序例化是将对象的状态存储到特定的存储介质中的过程反序例化是将特定的有合者公质中数据重新构建对象的过程。 3、Java中线程在哪个包下…

Ingress Controller介绍及部署实践

Ingress Controller介绍及部署实践 1. 概念 1.1 Ingress Ingress 提供从集群外部到集群内服务的 HTTP 和 HTTPS 路由。 流量路由由 Ingress 资源所定义的规则来控制。 下面是 Ingress 的一个简单示例&#xff0c;可将所有流量都发送到同一 Service&#xff1a; 通过配置&am…

WSL:桌面 UI + 远程连接 RDP + 配置 VScode

参考文献&#xff1a; 在windows10上利用WSL安装Ubuntu&#xff08;带桌面UI&#xff09;WSL2 Ubuntu图形界面安装与远程桌面Linux的桌面环境比较与选择&#xff08;gnome、kde、xfce、lxde&#xff09;Ubuntu 设置国内源&#xff0c;提高下载速度解决 PPA 源太慢Ubuntu 报错&…

11.常见的Transforms(二)

常见的Transforms&#xff08;二&#xff09; 1.Resize() 的使用 1.1 作用 resize可以把输入的图片按照输入的参数值重新设定大小。 1.2 所需参数 需要输入想要重新设定的图片大小。 输入的参数类型可以为包含长和宽数值的一个序列&#xff08;h,w&#xff09;或者一个整…

vue-cli的搭建过程

一、创建一个vue2的项目 二、创建成功后删除这三个文件 三、新建一个App.vue文件 四、在文件中添加这一段话 五、打开命令框输入指令下载router路由 六、新建一个router目录&#xff0c;新建index.js文件 七、导入你的路由&#xff0c;进行配置 打开命令行工具&#xff0c;进入…

【LeetCode】一、数组相关:双指针算法 + 置换

文章目录 1、算法复杂度1.1 时间复杂度1.2 空间复杂度 2、数组3、leetcode485&#xff1a;最大连续1的个数4、leetcode283&#xff1a;移动05、leetcode27&#xff1a;移除元素 1、算法复杂度 1.1 时间复杂度 算法的执行时间与输入值之间的关系&#xff08;看代码实际总行数的…

hive零基础入门

1、hive简介 hive&#xff1a;由facebook开源用于解决海量结构化数据的统计工具。 hive是基于Hadoop的数据仓库工具&#xff0c;可以将结构化的数据文件映射为一张表&#xff0c;并提供sql查询功能。 2、hive本质 hive的本质是HQL&#xff08;HiveSQL&#xff09;转化成MapR…

java 统计xmind的结点数(测试用例case数)

mac电脑解压出来的xmind的数据主要在content.json上 开头结尾有[],里面是json import org.json.JSONArray; import org.json.JSONObject; import java.io.*; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream;public class XMindLeafCounter2 {public stat…

PlatformIO开发环境

PlatformIO是一个开源的生态系统&#xff0c;用于构建物联网应用&#xff0c;它支持多种微控制器&#xff08;MCU&#xff09;和硬件开发板&#xff0c;并且与各种IDE集成良好&#xff0c;如VSCode, Atom等&#xff0c;使得跨平台的固件开发变得更加简单和高效。 ### 平台介绍…

博客建站1 - 选择博客系统框架

1. 本网站的系统架构2. 选择博客系统框架 2.1. 静态网站 2.1.1. 简介2.1.2. 特点2.1.3. 适用人群2.1.4. 常见框架 2.2. 动态网站 2.2.1. 简介2.2.2. 特点2.2.3. 适用人群2.2.4. 常见框架 3. 选择建议4. 我的博客系统 1. 本网站的系统架构 网站示例&#xff1a; sunlogging.c…

QEMU-aarch64与UEFI(EDK2)环境搭建

环境搭建是学习UEFI&#xff08;EDK2&#xff09;的重要前提&#xff0c;以下是基于QEMU-aarch64环境搭建UEFI&#xff08;EDK2&#xff09;的学习环境的过程&#xff1a; 安装虚拟机Ubuntu系统&#xff1a;首先需要在本地计算机上安装虚拟机软件&#xff0c;并在虚拟机上安装…

数据库自动备份到gitee上,实现数据自动化备份

本人有个不太好的习惯&#xff0c;每次项目的数据库都是在线上创建&#xff0c;Navicat 连接线上数据库进行处理&#xff0c;最近有一个项目需要二次升级&#xff0c;发现老项目部署的服务器到期了&#xff0c;完蛋&#xff0c;数据库咩了&#xff01;&#xff01;&#xff01;…

一篇文章教会你【elementUI搭建使用】

Element&#xff0c;一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的桌面端组 件库. 安装 ElementUI npm i element-ui -S 在 main.js 中写入以下内容&#xff1a; import ElementUI from element-ui; import element-ui/lib/theme-chalk/index.css; Vue.use(Eleme…

微信小程序代码体积过大上传失败——分包处理

最近开发一款小程序&#xff0c;内容较多&#xff0c;导致代码体积太大&#xff0c;上传到线上失败 解决方案 分包处理 注意&#xff1a;tabbar的页面不能放到子包 具体操作 这里分两个包&#xff1a; 第一步 在根目录创建packageA、packageB 第二步 把原本的pages目录下的部…

【漏洞复现】金和OA 任意文件上传

【产品介绍】 金和OA协同办公管理系统C6软件&#xff08;简称金和OA&#xff09;&#xff0c;本着简单、适用、高效的原则&#xff0c;贴合企事业单位的实际需求&#xff0c;实行通用化、标准化、智能化、人性化的产品设计&#xff0c;充分体现企事业单位规范管理、提高办公效…

老生常谈问题之什么是缓存穿透、缓存击穿、缓存雪崩?举个例子你就彻底懂了!!

老生常谈问题之什么是缓存穿透、缓存击穿、缓存雪崩&#xff1f;举个例子你就彻底懂了&#xff01;&#xff01; 缓存穿透发生场景解决方案 缓存击穿解决方案 缓存雪崩发生场景解决方案 总结三者区分三者原因三者解决方案 想象一下&#xff0c;你开了一家便利店&#xff0c;店里…

Unity3D Text使用超链接跳转事件

系列文章目录 Unity工具 文章目录 系列文章目录&#x1f449;前言&#x1f449;一、第一种使用TextMeshPro加入超链接&#x1f449;二、继承Text组件,重载OnPopulateMesh方法&#x1f449;三.壁纸分享&#x1f449;总结 &#x1f449;前言 有时候会用到跳转的问题,所以添加一…

基于深度学习的轮廓匹配

基于深度学习的轮廓匹配 轮廓匹配是一种用于识别和定位图像中物体的技术&#xff0c;通过比较图像中的轮廓与已知模板轮廓的相似度&#xff0c;确定目标物体的位置和形状。基于深度学习的轮廓匹配方法结合了卷积神经网络&#xff08;CNN&#xff09;等深度学习技术&#xff0c…