力扣第五十三题——最大子数组和
内容介绍
给你一个整数数组
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)的解法,尝试使用更为精妙的 分治法 求解。
完整代码
int maxSubArray(int* nums, int numsSize) {int pre = 0, maxAns = nums[0];for (int i = 0; i < numsSize; i++) {pre = fmax(pre + nums[i], nums[i]);maxAns = fmax(maxAns, pre);}return maxAns;
}
思路详解
一、问题背景
给定一个整数数组,要求找到数组中的最大子数组和。所谓最大子数组和,是指数组中一个或多个连续元素组成的子数组,其元素之和最大。
二、解题思路
-
动态规划:
- 使用动态规划的思想,通过遍历数组,记录当前位置之前所有可能的子数组和,从而找到最大的子数组和。
-
状态定义:
- 定义一个变量
pre来记录当前遍历到当前位置之前所有可能的子数组和的最大值。 - 初始时,
pre为0,因为第一个元素本身就是最大的子数组和。
- 定义一个变量
-
状态转移:
- 在遍历数组的过程中,对于每个元素,我们有两个选择:
- 将当前元素与之前的子数组和
pre相加,形成一个新的子数组和。 - 只考虑当前元素,形成一个新的子数组和。
- 将当前元素与之前的子数组和
- 我们选择这两个子数组和中的较大者作为新的
pre。
- 在遍历数组的过程中,对于每个元素,我们有两个选择:
-
结果记录:
- 在遍历过程中,我们需要记录
pre中的最大值,即当前找到的最大子数组和。 - 最终返回这个最大值。
- 在遍历过程中,我们需要记录
三、代码详解
- 初始化:
- 初始化
pre为0,表示当前还没有开始遍历数组。 - 初始化
maxAns为数组的第一个元素,因为至少包含一个元素的子数组和的最大值就是数组的第一个元素。
- 初始化
int pre = 0, maxAns = nums[0];
- 遍历数组:
- 遍历数组中的每个元素。
- 对于每个元素,计算两种情况下的子数组和,并取较大者作为新的
pre。 - 同时更新
maxAns为pre和maxAns中的较大者。
for (int i = 0; i < numsSize; i++) {pre = fmax(pre + nums[i], nums[i]);maxAns = fmax(maxAns, pre);
}
- 返回结果:
- 遍历结束后,
maxAns中存储的就是数组中的最大子数组和。 - 返回
maxAns。
- 遍历结束后,
return maxAns;
四、总结
通过动态规划的思想,我们能够高效地找到数组中的最大子数组和。关键在于维护当前遍历到当前位置之前所有可能的子数组和的最大值,并在遍历过程中不断更新这个值。这种方法的时间复杂度为O(n),空间复杂度为O(1),因为只需要常数级别的额外空间。
知识点精炼
一、核心概念
- 动态规划:一种通过保存中间结果来避免重复计算的算法设计技巧。
- 状态转移:在动态规划中,每个状态都是基于前一个状态计算得出的。
- 贪心算法:一种在每一步选择中都采取当前状态下最优(即看起来最有利)的选择,从而希望导致全局最优解的算法。
二、知识点精炼
-
最大子数组和问题:
- 要求在数组中找到一个子数组,其元素之和最大。
-
动态规划解法:
- 使用一个变量
pre来记录从数组开始到当前位置的所有可能的子数组和的最大值。 - 在遍历数组的过程中,更新
pre为当前元素与pre相加的和以及当前元素的较大者。
- 使用一个变量
-
状态转移:
- 在遍历数组的过程中,对于每个元素,有两种选择:
- 将当前元素与之前的子数组和
pre相加,形成一个新的子数组和。 - 只考虑当前元素,形成一个新的子数组和。
- 将当前元素与之前的子数组和
- 选择这两种子数组和中的较大者作为新的
pre。
- 在遍历数组的过程中,对于每个元素,有两种选择:
-
结果记录:
- 在遍历过程中,记录
pre中的最大值,即当前找到的最大子数组和。 - 最终返回这个最大值。
- 在遍历过程中,记录
三、性能分析
- 时间复杂度:O(n),因为需要遍历数组一次。
- 空间复杂度:O(1),只需要常数级别的额外空间。
四、实际应用
- 数据处理:在处理大量数据时,动态规划可以帮助我们找到最优解,从而提高效率。
- 算法竞赛:在算法竞赛中,掌握动态规划对于解决组合优化问题非常有帮助。
五、代码实现要点
- 初始化:正确初始化
pre和maxAns变量。 - 遍历数组:在遍历数组的过程中,正确更新
pre和maxAns变量。 - 返回结果:在遍历结束后,正确返回
maxAns变量。
动态规划的其他应用场景
-
最长公共子序列(LCS):
- 在两个或多个序列中找到最长的公共子序列,例如在文本编辑器中找到两个文本文件之间的差异。
-
最短路径问题:
- 在图论中,动态规划可以用于解决最短路径问题,例如Dijkstra算法和Floyd-Warshall算法。
-
背包问题:
- 在计算机科学中,背包问题是指给定一组物品和背包容量,如何选择物品放入背包以获得最大价值。
-
字符串匹配:
- 使用动态规划解决字符串匹配问题,如KMP算法,它可以高效地找到一个字符串在另一个字符串中出现的次数。
-
矩阵链乘法:
- 动态规划可以用来找到矩阵连乘的最优顺序,以最小化乘法运算的总次数。
-
最长递增子序列(LIS):
- 在数组中找到最长递增子序列的长度,例如在股票市场中找到最长的连续增长期。
-
编辑距离:
- 动态规划可以用来计算两个字符串之间的编辑距离,即通过插入、删除和替换字符来将一个字符串转换为另一个字符串的最少操作次数。
-
最优二叉搜索树:
- 动态规划可以用来构建最优二叉搜索树,即权值分配给节点,使得树的总权重最小。
-
股票买卖问题:
- 在股票市场中,动态规划可以用来解决如何在多次交易中最大化利润的问题。
-
硬币找零问题:
- 给定不同面值的硬币和需要找零的金额,动态规划可以用来找到找零的最少硬币数量。
相关文章:
力扣第五十三题——最大子数组和
内容介绍 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组 是数组中的一个连续部分。 示例 1: 输入:nums [-2,1,-3,4,-1,2,1,-5,4] 输出&…...
达梦数据库:select报错:不是 GROUP BY 表达式
目录 SQL示例报错信息原因排查解决方法一:达梦支持灵活的处理方式,可以直接在查询中加hint参数方法二:修改dm.ini参数GROUP_OPT_FLAG1,动态,会话级参数,不用重启数据库方法三:配置兼容参数&…...
大模型卷向「下半场」,产业场景成拼杀重地
在19世纪的一个雨声潺潺的夏日,诗人拜伦与雪莱在瑞士的湖畔边闲聊,他们聊到了一个大胆的想法:如果能够把一个生物的各个部分制造出来,再组装到一起,赋予它生命的温暖,那会怎样? 这次对话激发了…...
OD C卷 - 多线段数据压缩
多段 线 数据压缩 (200) 如图中每个方格为一个像素(i,j),线的走向只能水平、垂直、倾斜45度;图中线段表示为(2, 8)、(3,7)、(3, 6)、(…...
密码学基础:搞懂Hash函数SHA1、SHA-2、SHA3(2)
目录 1.引入 2. SHA512-224\256 3.SHA-3 4.MD5 5.SM3 1.引入 上篇密码学基础:搞懂Hash函数SHA1、SHA-2、SHA3(1)-CSDN博客,我们先就将基础的SHA1\2讲解了,接下来我们继续聊SHA-3、SHA2变体SHA512_224\256等 2. SHA512-224\256 SHA512…...
C++ 异步编程:std::async、std::future、std::packaged_task 和 std::promise
C 异步编程:std::async、std::future、std::packaged_task 和 std::promise 在现代 C 编程中,异步编程已经成为一种常见的模式。利用 C11 引入的标准库组件 std::async、std::future、std::packaged_task 和 std::promise,我们可以更方便地处…...
OD C卷 - 石头剪刀布游戏
石头剪刀布游戏 (100) 剪刀石头布游戏,A-石头、B-剪刀、C-布游戏规则: 胜负规则,A>B; B>C; C>A;当本场次中有且仅有一种出拳形状优于其他出拳形状,则该形状的玩家是胜利者,否则认为是…...
关于k8s集群中kubectl的陈述式资源管理
1、k8s集群资源管理方式分类 (1)陈述式资源管理方式:增删查比较方便,但是改非常不方便 使用一条kubectl命令和参数选项来实现资源对象管理操作 (2)声明式资源管理方式:yaml文件管理 使用yam…...
XML 学习笔记
简介: (1)XML:可扩展性标记语言,用于传输和存储数据,而不是展示数据,是W3C 推举的数据传输格式。 XML的标签必须自定义,但是在写标签名的时候一定要有含义。 XML 只能有一个根节点…...
MongoDB未授权访问漏洞
2.MongoDB未授权访问漏洞 mongodb数据库是由C编写,主要是为了提供web应可用扩展的一种高性能数据库。开启MongoDB服务时不添加任何参数时,默认是没有权限验证的,登录的用户可以通过默认端口无需密码对数据库任意操作(增、删、改、查高危动作)而且可以远程访问数据库…...
数据安全、信息安全、网络安全区别与联系
关键字: 信息安全 数据安全 网络安全 [导读] 让人更好理解 “数据安全”、“信息安全”、“网络安全” 三者间的区别与联系了,我们汇总了官方机构给这三者的定义,并且网友也给出了自己的看法,一起来看看。 在 “互联网 ” 被广…...
Jenkins未授权访问漏洞 *
漏洞复现 步骤一:使用以下fofa语法进行产品搜索.... port"8080" && app"JENKINS" && title"Dashboard [Jenkins]" 步骤二:在打开的URL中...点击Manage Jenkins --> Scritp Console在执行以下命令..…...
【爬虫原理】
《爬虫》 1、爬虫的概念 概念:(spider,网络蜘蛛)通过互联网上一个个的网络节点,进行数据的提取、整合以及存储 分类: 通用爬虫(了解) 主要用于搜索引擎(百度、…...
计算机组成原理 —— 指令流水线的基本概念
计算机组成原理 —— 指令流水线的基本概念 串行执行(Serial Execution)串行执行的特点串行执行的局限性串行执行的应用场景 并行执行定义基本原理五段式指令流水线优点缺点 流水线的性能指标示例计算 我们来了解一下指令流水线: 首先在这之…...
Python爬虫技术 第31节 持续集成和自动化部署
持续集成和自动化部署 Git版本控制 Git 是一个非常流行的分布式版本控制系统,用于跟踪对项目文件的修改。对于爬虫项目来说,使用Git可以帮助你管理代码的不同版本,协同开发,并且可以在出现问题时回滚到之前的版本。 基本操作&a…...
数据结构(C语言版)(第2版)课后习题答案
数据结构(C语言版)(第2版)课后习题答案 李冬梅 2015.3 目 录 第 1 章 绪论 1 第 2 章 线性表 5 第 3 章 栈和队列 13 第 4 章 串、数组和广义表 26 第 5 章 树和二叉树 33 第 6 章 图 43 第 7 章 查找 54 第 8 章 排序 65…...
打开轮盘锁问题(LeetCode)的分析总结及进一步提问
打开轮盘锁问题分析总结,及进一步提问:请给出一组最小步数下的号码序列组合 题目描述 你有一个带有四个圆形拨轮的转盘锁。每个拨轮都有10个数字: ‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’ 。每个拨轮可以自由…...
python——joblib进行缓存记忆化-对计算结果缓存
问题场景 在前端多选框需要选取多个数据进行后端计算。 传入后端是多个数据包的对应路径。 这些数据包需要按一定顺序运行,通过一个Bag(path).get_start_time() 可以获得一个float时间值进行排序,但由于数据包的特性,这一操作很占用性能和时…...
Linux文件管理
系列文章目录 提示:仅用于个人学习,进行查漏补缺。 1.Linux介绍、目录结构、文件基本属性、Shell 2.Linux常用命令 3.Linux文件管理 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言1…...
《Unity3D网络游戏实战》学习与实践--制作一款大乱斗游戏
角色类 基类Base Human是基础的角色类,它处理“操控角色”和“同步角色”的一些共有功能;CtrlHuman类代表“操控角色”,它在BaseHuman类的基础上处理鼠标操控功能;SyncHuman类是“同步角色”类,它也继承自BaseHuman&…...
【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...
LabVIEW双光子成像系统技术
双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制,展现出显著的技术优势: 深层组织穿透能力:适用于活体组织深度成像 高分辨率观测性能:满足微观结构的精细研究需求 低光毒性特点:减少对样本的损伤…...
