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) {
        // 选择当前元素自身或者加上之前的currentMax
        currentMax = 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; // 应该输出 1

    std::vector<int> testArray3 = { 5,4,-1,7,8 };
    std::cout << "Maximum subarray sum is: " << maxSubArraySum(testArray3) << std::endl; // 应该输出 23

    std::vector<int> testArray4 = { -8 };
    std::cout << "Maximum subarray sum is: " << maxSubArraySum(testArray4) << std::endl; // 应该输出 -8

    std::vector<int> testArray5 = { -2, -3, 4, -1, -2, 1, 5, -3 };
    std::cout << "Maximum subarray sum is: " << maxSubArraySum(testArray5) << std::endl; // 应该输出 7

    return 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 算法简洁且效率高,是解决最大子数组和问题的首选方法。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LLM 大模型学习必知必会系列(二):提示词工程-Prompt Engineering 以及实战闯关

角色扮演&#xff1a;在系统指令中告诉千问你需要它扮演的角色&#xff0c;即可沉浸式和该角色对话交流语言风格&#xff1a;简单调整 LLM 的语言风格任务设定&#xff1a;比如旅行规划&#xff0c;小红书文案助手这样的专项任务处理System message 也可以被用于规定 LLM 的答复…

使用 LiteGraph.js 构建可视化工作流图

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 使用 LiteGraph.js 构建可视化工作流图 应用场景介绍 LiteGraph.js 是一个轻量级的开源 JavaScript 库&#xff0c;用于构建可视化工作流图。它广泛应用于游戏开发、数据可视化、交互式叙事等领域。 代码基本…

人工智能的兴起和发展

人工智能的兴起 人工智能&#xff0c;artificial intelligence&#xff0c;缩写为AI。 它是随着计算机技术的发展才逐步产生并发展起来的一门学科。关于AI的定义有很多种&#xff0c;通俗一点说&#xff0c;它企图了解智能的实质&#xff0c;并生产出一种新的&#xff0c;能以…

从学士-硕士-博士-博士后-副教授-教授-优青-杰青-长江-院士:一文看懂学术巨人的成长历程

会议之眼 快讯 学术之路&#xff0c;如同攀登一座高耸入云的山峰&#xff0c;需要毅力、智慧和不断的求知探索。从奠定基础的学士&#xff0c;到站在学术巅峰的院士。这条成长之路充满了挑战和机遇。 如果把学术界比作王者荣耀&#xff0c;那么学者们的成长历程就像是在进行一…

真实场景 这周的任意一天,获取上周一到周日的时间范围-作者:【小可耐教你学影刀RPA】

用户场景 我想在这周的任意一天&#xff0c;获取上周一到周日的时间范围&#xff0c;应该怎么做 解决办法1 用指令解决 最简单 解决办法2 自己写逻辑 不过要用到 获取当前日期指令 当前是礼拜几

DuDuTalk柜台拾音器:如何助力营业厅实现3分钟快速风险响应?

在运营商、金融服务、政府服务场景&#xff0c;营业厅是企业和政府与客户互动的第一线&#xff0c;也是风险管理的关键环节。随着技术的发展&#xff0c;以AI技术为基础的新一代营业厅柜台服务智能管理产品——DuDuTalk柜台拾音器已成为营业厅风险管理的新策略&#xff0c;帮助…

Docker部署青龙面板

青龙面板 文章目录 青龙面板介绍资源列表基础环境一、安装Docker二、安装Docker-Compose三、安装青龙面板3.1、拉取青龙&#xff08;whyour/qinglong&#xff09;镜像3.2、编写docker-compose文件3.3、检查语法启动容器 四、访问青龙面板五、映射本地部署的青龙面板至公网5.1、…

TCP的核心属性

TCP的核心属性 一: TCP的核心属性1.1: 确认应答:1.2 : 超时重传1.3 : 连接管理1.3.1 三次握手1.3.2 四次挥手 1.4 滑动窗口1.5: 流量控制:1.6 拥塞控制1.7 延时应答1.8 :捎带应答1.9: 面向字节流1.10 : 异常情况 一: TCP的核心属性 1.1: 确认应答: 保证可靠性最核心的机制 1…

Pinterest免费引流实操演示

这篇文章中你将了解到 1.Pinterest网站介绍&#xff0c;用户群体&#xff0c;适合做什么品类。 2.现在的商家都在上面做什么&#xff1f;案例展示。 3.我们在这个站免费引流要怎么做以及注意事项。 1.Pinterest网站介绍&#xff0c;用户群体&#xff0c;适合做什么品类。 P…

如何令谷歌浏览器搜索时,子页面使用新窗口,而不是迭代打开

1 问题描述 工作相关需要常用谷歌浏览器&#xff0c;但是现在设置就是每次搜索后&#xff0c;点击搜索结果进去之后&#xff0c;都会覆盖掉原来的父页面&#xff0c;也就是如果我看完了这个子页面的内容&#xff0c;关掉的话&#xff0c;我就需要重新google.com来一遍。。。很…

面试题------>MySQL!!!

一、连接查询 ①&#xff1a;左连接left join &#xff08;小表在左&#xff0c;大表在右&#xff09; ②&#xff1a;右连接right join&#xff08;小表在右&#xff0c;大表在左&#xff09; 二、聚合函数 SQL 中提供的聚合函数可以用来统计、求和、求最值等等 COUNT&…

IO流,文件操作

参考 Java IO 基础知识总结 | JavaGuide 史上最骚最全最详细的IO流教程&#xff0c;没有之一&#xff01; - 宜春 - 博客园 零、io-流简介 IO 即 Input/Output&#xff0c;输入和输出。数据输入到计算机内存的过程即输入&#xff0c;反之输出到外部存储&#xff08;比如数据…

什么是 Batch Normalization 批标准化和全连接层

Batch Normalization 神经元在经过激活函数之后会处于饱和状态&#xff0c;无论后续怎么变化都不会再起作用。 每一层都会进行batch normalization的处理&#xff01; without normalization 会导致数据分布再饱和区 全连接层&#xff1a; 全连接层(fully connected layers&a…

微信公众号文章背景颜色改成白色

微信公众号文章背景颜色黑色&#xff0c;看不清字。 按F12 , 找到 rich_media_area_primary &#xff0c;把 background 改成 white .rich_media_area_primary {background: white; }

云端狂飙:Django项目部署与性能优化的极速之旅

Hello&#xff0c;我是阿佑&#xff0c;这次阿佑将手把手带你亲自踏上Django项目从单机到云端的全过程&#xff0c;以及如何通过Docker实现项目的无缝迁移和扩展。不仅详细介绍了Docker的基本概念和操作&#xff0c;还深入探讨Docker Compose、Swarm和Kubernetes等高级工具的使…

python语言中循环语句的小结

如上图所示&#xff0c;在C/C/Java中如果使用的for循环语句和do while语句都与python中的while循环语句类似&#xff0c;所以在C/C/Java中如果使用的for循环语句在python中可以用while语句来替换。

上位机图像处理和嵌入式模块部署(f407 mcu中的udp server开发)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 既然lwip已经port到407上面了&#xff0c;接下来其实就可以做一些测试了。本身lwip支持tcp、udp&#xff0c;也支持client和server&#xff0c;既然…

python语言中的break和continue

continue立即结束当前这次循环&#xff0c;进入下次循环 break立即结束整个循环。 如上图所示&#xff0c;在python语言中break和continue语句常常搭配条件语句一起使用。 如上图所示&#xff0c;while True&#xff1a; 光看到while True 不一定是死循环&#xff0c; 关键是…

【Kubernetes】 emptyDir、nfs存储卷 和 PV、PVC

emptyDir存储卷 当pod被分配给节点 容器和容器之间进行共享存储 hostPath nfs共享存储卷 NAS 专业的存储设备&#xff1b;一般是与NFS 搭配&#xff0c;然后共享出去 GFS 自己搭&#xff1b;CEPH(至少要9台) 第三方&#xff1b;NAS 第三方&#xff1b; 云端 oss …

一维时间序列信号的小波时间散射变换(MATLAB 2021)

小波散射变换的目的在于获取第一层次的特征信息&#xff0c;即免疫平移、轻微形变的信息。而低通的滤波器能够获取输入信号的概貌&#xff0c;获取反映其整体大尺度特征的信息&#xff0c;以图像为例&#xff0c;由低通滤波器选取的信号对于图像的平移、伸缩、旋转等局部变化有…