最大子序和问题——动态规划/贪心算法解决
目录
一:问题描述
二:解决思路1——动态规划思想
三:C 语言代码实现
四:复杂度分析
五:解决思路2——贪心算法思想
六:具体步骤
七: C语言代码实现
八:复杂度分析
一:问题描述
最大子序和问题指的是在一个整数数组里,找出一个具有最大和的连续子数组(子数组最少包含一个元素),然后返回其最大和。
例如,对于数组 [-2,1,-3,4,-1,2,1,-5,4],其连续子数组 [4,-1,2,1] 的和最大,为 6。
二:解决思路1——动态规划思想
- 定义一个数组
dp,其中dp[i]代表以第i个元素结尾的连续子数组的最大和。 - 状态转移方程:
dp[i] = max(dp[i - 1] + nums[i], nums[i])。也就是说,以第i个元素结尾的连续子数组的最大和,要么是把第i个元素加入到以第i - 1个元素结尾的连续子数组中,要么是第i个元素单独作为一个子数组。 - 最终的最大子序和就是
dp数组中的最大值。
三:C 语言代码实现
#include <stdio.h>// 函数用于找出最大子序和
int maxSubArray(int* nums, int numsSize) {if (numsSize == 0) return 0;int dp[numsSize];dp[0] = nums[0];int max_sum = dp[0];for (int i = 1; i < numsSize; i++) {// 状态转移方程if (dp[i - 1] + nums[i] > nums[i]) {dp[i] = dp[i - 1] + nums[i];} else {dp[i] = nums[i];}// 更新最大和if (dp[i] > max_sum) {max_sum = dp[i];}}return max_sum;
}int main() {int nums[] = {-2, 1, -3, 4, -1, 2, 1, -5, 4};int numsSize = sizeof(nums) / sizeof(nums[0]);int result = maxSubArray(nums, numsSize);printf("最大子序和为: %d\n", result);return 0;
}
四:复杂度分析
- 算法的时间复杂度为 (O(n)),其中 n 是数组的长度。
五:解决思路2——贪心算法思想
贪心算法的核心思想在于每一步都做出当下看起来最优的选择,期望通过局部最优解来达成全局最优解。
在最大子序和问题中,我们可以在遍历数组的过程里,持续更新当前的连续子数组和,并且在每一步都判断是否要更新最大和。
六:具体步骤
-
初始化变量:
- 定义两个变量,
current_sum用于记录当前连续子数组的和,初始值设为数组的第一个元素。 max_sum用于记录到目前为止所找到的最大子序和,初始值也设为数组的第一个元素。
- 定义两个变量,
-
遍历数组:
- 从数组的第二个元素开始遍历。
- 对于每一个元素
nums[i],有两种情况:- 如果
current_sum加上当前元素nums[i]后比nums[i]本身大,那么就把nums[i]加入到当前连续子数组中,即current_sum = current_sum + nums[i]。 - 反之,说明之前的连续子数组和是负数,继续保留它会让和变小,所以舍弃之前的连续子数组,从当前元素
nums[i]开始一个新的连续子数组,即current_sum = nums[i]。
- 如果
-
更新最大和:
- 在每次更新
current_sum之后,比较current_sum和max_sum的大小。如果current_sum大于max_sum,就更新max_sum为current_sum。
- 在每次更新
-
返回结果:
- 遍历完整个数组后,
max_sum中存储的就是最大子序和,将其返回。
- 遍历完整个数组后,
七: C语言代码实现
#include <stdio.h>// 函数用于找出最大子序和
int maxSubArray(int* nums, int numsSize) {if (numsSize == 0) return 0;int current_sum = nums[0];int max_sum = nums[0];for (int i = 1; i < numsSize; i++) {// 判断是否更新当前连续子数组和if (current_sum + nums[i] > nums[i]) {current_sum = current_sum + nums[i];} else {current_sum = nums[i];}// 更新最大和if (current_sum > max_sum) {max_sum = current_sum;}}return max_sum;
}int main() {int nums[] = {-2, 1, -3, 4, -1, 2, 1, -5, 4};int numsSize = sizeof(nums) / sizeof(nums[0]);int result = maxSubArray(nums, numsSize);printf("最大子序和为: %d\n", result);return 0;
}
八:复杂度分析
- 时间复杂度:(O(n)),这里的 n 是数组的长度。因为只需要对数组进行一次遍历。
- 空间复杂度:(O(1)),只使用了常数级的额外空间。
相关文章:
最大子序和问题——动态规划/贪心算法解决
目录 一:问题描述 二:解决思路1——动态规划思想 三:C 语言代码实现 四:复杂度分析 五:解决思路2——贪心算法思想 六:具体步骤 七: C语言代码实现 八:复杂度分析 一:问题描述 …...
【Unity】JSON数据的存取
这段代码的结构是为了实现 数据的封装和管理,特别是在 Unity 中保存和加载玩家数据时。以下是对代码设计的逐步解释: 1. PlayerCoin 类 PlayerCoin 是一个简单的数据类,用于表示单个玩家的硬币信息。它包含以下字段: count&…...
LeetCode【剑指offer】系列(位运算篇)
剑指offer15.二进制中1的个数 题目链接 题目:编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为 汉明重量).)。 思路一ÿ…...
unity socket 客户端和c#服务器通信
服务器 using BarrageGrab; using System; using System.Collections.Concurrent; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading;namespace Lyx {class Server{private TcpListener listener;private Concurre…...
如何在Vue中实现取消聚焦el-select——从零到部署的完整指南
如何在Vue中实现取消聚焦el-select——从零到部署的完整指南 在开发Vue项目时,经常会遇到需要处理用户交互和组件状态管理的情况。特别是在使用Element UI组件库时,如何优雅地管理组件的状态显得尤为重要。本文将详细介绍如何在取消对话框时自动取消el-s…...
网络安全领域的AI战略准备:从概念到实践
网络安全领域的AI准备不仅涉及最新工具和技术的应用,更是一项战略必需。许多企业若因目标不明确、数据准备不足或与业务重点脱节而未能有效利用AI技术,可能面临严重后果,包括高级网络威胁数量的激增。 AI准备的核心要素 构建稳健的网络安全…...
《重构全球贸易体系用户指南》解读
文章目录 背景核心矛盾与理论框架美元的“特里芬难题”核心矛盾目标理论框架 政策工具箱的协同运作机制关税体系的精准打击汇率政策的混合干预安全工具的复合运用 实施路径与全球秩序重构阶段性目标 风险传导与反制效应内部失衡加剧外部反制升级系统性风险 范式突破与理论再思考…...
MacOs下解决远程终端内容复制并到本地粘贴板
常常需要在服务器上捣鼓东西,同时需要将内容复制到本地的需求。 1-内容是在远程终端用vim打开,如何用vim的类似指令达到快速复制到本地呢? 假设待复制的内容: #include <iostream> #include <cstring> using names…...
基于PAI+专属网关+私网连接:构建全链路 Deepseek 云上私有化部署与模型调用架构
DeepSeek - R1 是由深度求索公司推出的首款推理模型,该模型在数学、代码和推理任务上的表现优异,市场反馈火爆。在大模型技术商业化进程中,企业级用户普遍面临四大核心挑战: 算力投入成本高昂:构建千亿参数级模型的训…...
【cocos creator 3.x】cocos creator2.x项目升级3.x项目改动点
1、基本改动 基本改动:去掉了cc.,改成在顶部添加导入 项目升级时候直接将cc.去掉,根据提示添加引用 node只保留position,scale,rotation,layer 其余属性如opacity,如果需要使用需要在节点手动添加UIOpacity组件 3d层和ui层分开…...
eBay东南亚爆单密码:72小时交付计划如何重构厦门仓+东南亚供应链?
2024年东南亚电商市场规模预计突破2340亿美元,年复合增长率达18%。eBay最新战略将厦门纳入海外仓核心节点,推出“72小时交付计划”,通过“仓配转”一体化链路,助力中国卖家实现东南亚市场订单履约率提升10%,退货成本降…...
List基础与难度题
1. 向 ArrayList 中添加元素并打印 功能描述: 程序创建一个空的 ArrayList 集合,用于存储字符串类型的元素。向该 ArrayList 中依次添加指定的字符串元素。使用增强型 for 循环遍历 ArrayList 中的所有元素,并将每个元素打印输出到控制台。 …...
Oracle19C低版本一天遭遇两BUG(ORA-04031/ORA-600)
昨天帮朋友看一个系统异常卡顿的案例,在这里分享给大家 环境:Exadata X8M 数据库版本19.11 1.系统报错信息 表象为系统卡顿,页面无法刷出,登陆到主机上看到节点1 系统等待存在大量的 cursor: pin S wait on X等待 查看两个节…...
golang处理时间的包time一次性全面了解
本文旨在对官方time包有个全面学习了解。不钻抠细节,但又有全面了解,重点介绍常用的内容,一些低频的可能这辈子可能都用不上。主打一个花最少时间办最大事。 Duration对象: 两个time实例经过的时间,以长度为int64的纳秒来计数。 常见的durati…...
C++学习:六个月从基础到就业——面向对象编程:重载运算符(下)
C学习:六个月从基础到就业——面向对象编程:重载运算符(下) 本文是我C学习之旅系列的第十三篇技术文章,是面向对象编程中运算符重载主题的下篇。本篇文章将继续深入探讨高级运算符重载技术、特殊运算符、常见应用场景和…...
【网络安全】谁入侵了我的调制解调器?(二)
文章目录 针对 TR-069 协议 REST API 的攻击思路攻击百万台调制解调器意外发现 Cox 后端 API 的授权绕过漏洞确认我们能够进入任何人的设备访问和更新任何Cox商业客户账户通过泄露的加密密钥覆盖任何人的设备设置执行对任何调制解调器的命令影响最后想说阅读本文前,请先行浏览…...
【4.1.-4.20学习周报】
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 摘要Abstract一、方法介绍1.1HippoRAG 1.2HippoRAG2二、实验2.1实验概况2.2实验代码2.3实验结果 总结 摘要 本博客介绍了论文《From RAG to Memory: Non-Parametri…...
MySQL 临时表介绍
在 MySQL 数据库中,临时表是一种特殊类型的表,它在数据库会话期间存在,会话结束时自动删除。临时表为处理特定的、临时性的数据操作任务提供了一种高效且便捷的方式。 一、临时表的创建 使用CREATE TEMPORARY TABLE语句来创建临时表。其语法…...
Rust : 关于*const () 与type erase
*const () 可以替代泛型,更加灵活。下面举了两个完全不一样的数据结构Foo和Bar;以及不同的函数,来说明。 一、 代码 trait Work {fn process(&self); } struct Foo(String);impl Work for Foo {fn process(&self) {println!("p…...
python学习—合并多个word文档
系列文章目录 python学习—合并TXT文本文件 python学习—统计嵌套文件夹内的文件数量并建立索引表格 python学习—查找指定目录下的指定类型文件 python学习—年会不能停,游戏抽签抽奖 python学习—循环语句-控制流 python学习—合并多个Excel工作簿表格文件 pytho…...
Java LinkedList深度解析:双向链表的实现艺术与实战指南
在Java集合框架中,LinkedList以其独特的双向链表结构和灵活的操作特性,成为处理动态数据的重要工具。本文将从底层实现、核心方法、性能优化到企业级应用场景,全方位解析这一经典数据结构的设计哲学与实战技巧。 一、LinkedList的设计定位与核心特性 1. 双向链表的本质 Lin…...
c#内存泄露的原因和解决办法
内存泄漏的原因 不正确的对象引用:最常见的原因是对象不再需要时未被垃圾回收器回收。例如,如果一个对象被一个不再使用的变量引用,它将不会被垃圾回收。事件订阅者未取消:如果订阅了一个事件但没有在对象不再需要时取消订阅&…...
android如何在生产环境中做到详实的日志收集而不影响性能?
在Android应用的生命周期中,日志收集贯穿于开发、测试到生产环境的每一个阶段。特别是在生产环境中,当应用部署到成千上万的用户设备上时,开发者无法直接访问用户的运行环境,也无法像在开发阶段那样通过调试工具实时查看代码执行情况。这时,日志就成为连接开发者与用户设备…...
MySQL安装实战:从零开始搭建你的数据库环境
MySQL作为全球最流行的开源关系型数据库,是开发者、运维人员及数据管理者的核心工具之一。本文将通过多平台安装指南、关键配置解析及常见问题排查三个维度,手把手带你完成MySQL环境搭建。 一、多平台安装指南 1. Linux系统(以Ubuntu为例&am…...
[Python] UV工具入门使用指南——小试牛刀
背景 MCP开发使用到了uv,简单记录一下: 为什么MCP更推荐使用uv进行环境管理? MCP 依赖的 Python 环境可能包含多个模块,uv 通过 pyproject.toml 提供更高效的管理方式,并且可以避免 pip 的一些依赖冲突问题。…...
PclSharp ——pcl的c#nuget包
简介: NuGet Gallery | PclSharp 1.8.1.20180820-beta07 下载.NET Framework 4.5.2 Developer Pack: 下载 .NET Framework 4.5.2 Developer Pack Offline Installer 离线安装nupkg: nupkg是visual studio 的NuGet Package的一个包文件 安…...
多任务响应1(Qt)
多任务响应1 1. 架构概述2. 代码示例3. 说明 当系统的一些任务都是同一个对象产生,但需要交由不同对象进行响应。 比如:系统有多个按键,这些按键的共用一个槽函数,但不同的按键对应不同的功能响应。 推荐采用命令模式分散响应的思…...
1. k8s的简介
Kubernetes(k8s)简介 1. 产生背景 随着云计算和微服务架构的兴起,传统的单体应用逐渐被拆分为多个小型、松耦合的服务(微服务)。这种架构虽然提升了开发灵活性和可维护性,但也带来了新的挑战:…...
单片机 | 基于51单片机的倾角测量系统设计
以下是一个基于51单片机的倾角测量系统设计详解,包含原理、公式和完整代码: 一、系统原理 核心器件:MPU6050(集成3轴加速度计+陀螺仪) 主控芯片:STC89C52RC(51单片机) 显示模块:LCD1602液晶 工作原理: 通过MPU6050采集XYZ三轴加速度数据,利用重力加速度分量计算俯仰…...
div(HTML标准元素)和view(微信小程序专用组件)的主要区别体
div(HTML标准元素)和view(微信小程序专用组件)的主要区别体现在以下方面: 一、应用场景与开发框架 适用平台不同 div是HTML/CSS开发中通用的块级元素,用于Web页面布局;view是微信小程序专…...
