力扣第五十三题——最大子数组和
内容介绍
给你一个整数数组
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&…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...
uniapp 开发ios, xcode 提交app store connect 和 testflight内测
uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...
Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storms…...
