LeetCode 算法:最大子数组和c++

原题链接🔗:最大子数组和
难度:中等⭐️⭐️

题目

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

子数组是数组中的一个连续部分。

示例 1
输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。

示例 2
输入:nums = [1]
输出:1

示例 3
输入:nums = [5,4,-1,7,8]
输出:23

提示
1 <= nums.length <= 105
-104 <= nums[i] <= 104

进阶:如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的 分治法 求解。

题解

动态规划法

  1. 题解:Kadane 算法。
  2. 复杂度:时间复杂度为 O(n),空间复杂度为 O(1)
  3. 代码过程
  • 初始化变量
    • currentMax:当前子数组的最大和,初始值为数组的第一个元素。
    • globalMax:全局最大子数组和,初始值同 currentMax。
  • 遍历数组: 从数组的第二个元素开始遍历(如果数组不为空)。
  • 更新当前最大和:对于数组中的每个元素 nums[i],决定是将其加到当前子数组的末尾,还是从这个元素开始一个新的子数组。这可以通过比较 nums[i] 和 currentMax + nums[i] 来实现,取两者中的较大值作为新的 currentMax。
  • 更新全局最大和:在每次迭代中,比较 currentMax 和 globalMax,将较大的值赋给 globalMax。
  • 返回结果:遍历完成后,globalMax 将包含整个数组的最大子数组和。
  1. c++ demo:
#include <iostream>
#include <vector>
#include <algorithm> // 用于 std::max 函数// 函数返回最大子数组和
int maxSubArraySum(const std::vector<int>& nums) {if (nums.empty()) return 0;int currentMax = nums[0];int globalMax = nums[0];for (int i = 1; i < nums.size(); ++i) {// 选择当前元素自身或者加上之前的currentMaxcurrentMax = std::max(nums[i], currentMax + nums[i]);// 更新全局最大值globalMax = std::max(globalMax, currentMax);}return globalMax;
}// 主函数
int main() {// 测试用例std::vector<int> testArray = { -2,1,-3,4,-1,2,1,-5,4 };// 调用函数并打印结果int maxSum = maxSubArraySum(testArray);std::cout << "Maximum subarray sum is: " << maxSum << std::endl; // 应该输出 6,因为 [4,-1,2,1] 是最大子数组// 可以添加更多的测试用例来验证算法的正确性std::vector<int> testArray2 = { 1 };std::cout << "Maximum subarray sum is: " << maxSubArraySum(testArray2) << std::endl; // 应该输出 1std::vector<int> testArray3 = { 5,4,-1,7,8 };std::cout << "Maximum subarray sum is: " << maxSubArraySum(testArray3) << std::endl; // 应该输出 23std::vector<int> testArray4 = { -8 };std::cout << "Maximum subarray sum is: " << maxSubArraySum(testArray4) << std::endl; // 应该输出 -8std::vector<int> testArray5 = { -2, -3, 4, -1, -2, 1, 5, -3 };std::cout << "Maximum subarray sum is: " << maxSubArraySum(testArray5) << std::endl; // 应该输出 7return 0;
}
  • 运行结果:

Maximum subarray sum is: 6
Maximum subarray sum is: 1
Maximum subarray sum is: 23
Maximum subarray sum is: -8
Maximum subarray sum is: 7
在这里插入图片描述

Kadane 算法

Kadane
算法是一种用于解决最大子数组和问题的有效算法。最大子数组和问题是指在给定的整数数组中找到一个连续子数组,使得该子数组的和最大。Kadane
算法通过动态规划的思想来解决这个问题,其核心思想是利用当前子数组的和来帮助确定后续子数组的最大和。

Kadane 算法的步骤:

  1. 初始化:设置两个变量 currentMaxglobalMax 来分别存储当前子数组的最大和以及全局最大和。初始时,这两个变量都设为数组的第一个元素。

  2. 遍历数组:从数组的第二个元素开始遍历。

  3. 更新当前最大和:对于当前遍历到的元素 nums[i],决定是将其加到当前子数组的和中,还是从当前元素开始一个新的子数组。这可以通过比较 nums[i]
    currentMax + nums[i] 的大小来实现。如果 nums[i] 本身就大于 currentMax + nums[i],说明当前子数组加上这个元素后的和会减小,因此应该从 nums[i] 开始一个新的子数组。

    更新公式为: [ \text{currentMax} = \max(\text{nums}[i],
    \text{currentMax} + \text{nums}[i]) ]

  4. 更新全局最大和:每次更新完 currentMax 后,比较 currentMaxglobalMax 的大小,并更新 globalMax

  5. 返回结果:遍历完成后,globalMax 将包含整个数组的最大子数组和。

Kadane 算法的特点:

  • 时间复杂度:O(n),其中 n 是数组的长度,因为算法只遍历一次数组。
  • 空间复杂度:O(1),只需要常数级别的额外空间。

Kadane 算法简洁且效率高,是解决最大子数组和问题的首选方法。

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

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

相关文章

JVM之【字节码/Class文件/ClassFile 内容解析】

说在前面的话 Java语言:跨平台的语言(write once,run anywhere) 当Java源代码成功编译成字节码后&#xff0c;如果想在不同的平台上面运行&#xff0c;则无须再次编译这个优势不再那么吸引人了。Python、PHP、Perl、Ruby、Lisp等有强大的解释器。跨平台似乎已经快成为一门语言…

Vue 3 Teleport:掌控渲染的艺术

title: Vue 3 Teleport&#xff1a;掌控渲染的艺术 date: 2024/6/5 updated: 2024/6/5 description: 这篇文章介绍了Vue3框架中的一个创新特性——Teleport&#xff0c;它允许开发者将组件内容投送到文档对象模型&#xff08;DOM&#xff09;中的任意位置&#xff0c;即使这个位…

房地产3d全景数字化看房成为转发的好工具

在短视频盛行的时代&#xff0c;某地产企业为了吸引客流&#xff0c;联合我们深圳VR公司定制了楼盘小区3D全景展示视频&#xff0c;不同于市面上常见的楼盘视频或3D电影&#xff0c;楼盘小区3D全景展示视频让您在小区建成之前&#xff0c;就能提前感受未来的生活场景。 无需昂贵…

C++第三方库【httplib】断点续传

什么是断点续传 上图是我们平时在浏览器下载文件的场景&#xff0c;下载的本质是数据的传输。当出现网络异常&#xff0c;浏览器异常&#xff0c;或者文件源的服务器异常&#xff0c;下载都可能会终止。而当异常解除后&#xff0c;重新下载文件&#xff0c;我们希望从上一次下载…

【技巧】系统语音是英文 影刀如何设置中文-作者:【小可耐教你学影刀RPA】

写在前面 嘿哈&#xff01; 有些跨境或香港的小伙伴&#xff0c;可能需要使用英文操作界面的影刀 该功能目前还没有现成的可视化按钮&#x1f518; 但其实这个效果可以实现&#xff5e; 1、效果图 2、实现原理 %影刀安装目录%\ShadowBot-版本号\ShadowBot.Shell.dll.confi…

2024050401-重学 Java 设计模式《实战代理模式》

重学 Java 设计模式&#xff1a;实战代理模式「模拟mybatis-spring中定义DAO接口&#xff0c;使用代理类方式操作数据库原理实现场景」 一、前言 难以跨越的瓶颈期&#xff0c;把你拿捏滴死死的&#xff01; 编程开发学习过程中遇到的瓶颈期&#xff0c;往往是由于看不到前进…

机器学习:更多关于元学习

目录 Meta Learning vs Self-supervised Learning 自监督学习——找初始化的参数MAML 自动学出合适的参数 MAML&#xff1a;不断的学初始化参数MAML的初始化参数来自BERT MAML&#xff1a;找出来的初始化参数能在训练任务上表现的很好BERT&#xff1a;自监督目标是不同的下游任…

odoo10 权限控制用户只允许看到自己的字段

假设一个小区管理员用户&#xff0c;只想看到自己小区的信息。 首先添加一个用户信息选项卡界面&#xff0c;如下图的 用户 > 隶属信息&#xff1a; 我们在自己创建的user模块中&#xff0c;views文件夹下添加base_user.xml <?xml version"1.0" encoding&q…

Angular17(2):angular项目中使用NG-ZORRO

1、使用Angular CLI创建空项目 ng new angular-admin-web --stylescss 2、执行ng add ng-zorro-antd命令安装 &#xff08;1&#xff09;ng add ng-zorro-antd 在angular项目下运行命令 ng add ng-zorro-antd 跟随选项便可完成初始化配置&#xff0c;包括引入国际化文件&…

上位机图像处理和嵌入式模块部署(f407 mcu中的单独上位机烧录方法)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面我们说过&#xff0c;stm32有三种烧录方法&#xff0c;一种是st-link v2&#xff0c;一种是dap&#xff0c;一种是j-link。不过我们在实际操作…

C++基础编程100题-004 OpenJudge-1.1-06 空格分隔输出

更多资源请关注纽扣编程微信公众号 http://noi.openjudge.cn/ch0101/06/ 描述 读入一个字符&#xff0c;一个整数&#xff0c;一个单精度浮点数&#xff0c;一个双精度浮点数&#xff0c;然后按顺序输出它们&#xff0c;并且要求在他们之间用一个空格分隔。输出浮点数时保留…

中信证券:A股下半年将迎来年度级别上涨行情的起点

中信证券认为&#xff0c; 过去3年压制A股表现的经济动能转换&#xff0c;资本市场生态&#xff0c;中美战略博弈这三大叙事都将迎来重大拐点&#xff0c;随着政策、价格、外部三类信号逐步验证&#xff0c;2024年下半年A股市场将迎来年度级别上涨行情的起点 过去3年压制A股表…

鸿蒙开发接口安全:【@ohos.userIAM.userAuth (用户认证)】

用户认证 说明&#xff1a; 本模块首批接口从API version 6开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 导入模块 import userIAM_userAuth from ohos.userIAM.userAuth;完整示例 // API version 6 import userIAM_userAuth from ohos.use…

最小栈、栈的弹出(C++)

1.最小栈 思路分析&#xff1a; 代码&#xff1a; class MinStack { public:MinStack() {}void push(int val) {st.push(val);//两种情况需要更新最小值//1.最小栈为空(就是存最小值的那个栈)//2.插入的值小于或等于最小栈的栈顶元素if(minstack.empty()||minstack.top()>…

C++--DAY3

思维导图 设计一个Per类&#xff0c;类中包含私有成员:姓名、年龄、指针成员身高、体重&#xff0c;再设计一个Stu类&#xff0c;类中包含私有成员:成绩、Per类对象p1&#xff0c;设计这两个类的构造函数、析构函数。 #include <iostream>using namespace std; class …

SOCKS 代理 和 HTTP 代理, WebSocket

SOCKS 代理 和 HTTP 代理 的区别 SOCKS 代理 和 HTTP 代理 都是代理服务器&#xff0c;它们充当客户端和目标服务器之间的中介&#xff0c;但它们的工作方式和应用场景有所不同。 1. SOCKS 代理&#xff1a; 工作原理&#xff1a; SOCKS 代理是一种更底层的代理&#xff0c;…

查看docker中各个容器所占的资源

要查看Docker中的每个容器占用的资源&#xff0c;可以使用docker stats命令。这个命令提供了容器的实时资源使用统计&#xff0c;包括内存使用情况。以下是如何使用docker stats命令的示例&#xff1a; docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsa…

【QT5】<总览三> QT常用控件

文章目录 前言 一、QWidget---界面 二、QPushButton---按钮 三、QRadioButton---单选按钮 四、QCheckBox---多选、三选按钮 五、margin&padding---边距控制 六、QHBoxLayout---水平布局 七、QVBoxLayout---垂直布局 八、QGridLayout---网格布局 九、QSplitter---…

React@16.x(20)渲染流程-首次渲染

目录 1&#xff0c;渲染的前置知识点1.1&#xff0c;React 元素1.2&#xff0c;React 节点1.3&#xff0c;节点类型1.4&#xff0c;真实DOM 2&#xff0c;首次渲染2.1&#xff0c;根据参数创建节点2.2&#xff0c;不同节点&#xff0c;有不同处理2.3&#xff0c;生成虚拟DOM树2…

course-nlp——2-svd-nmf-topic-modeling

本文参考自https://github.com/fastai/course-nlp。 使用NMF and SVD进行主题建模 问题 主题建模是开始学习 NLP 的一种有趣方式。我们将使用两种流行的矩阵分解技术。考虑最极端的情况——使用两个向量的外积重建矩阵。显然&#xff0c;在大多数情况下&#xff0c;我们无法…