当前位置: 首页 > news >正文

LeetCode 53 - 最大子数组和

思路:动态规划

关键:当前元素 nums[i] 结尾的最大子数组和

  1. 定义状态cur 表示以当前元素结尾的最大子数组和,maxAns 表示全局最大和。
  2. 决策:遍历数组,对于每个元素 nums[i],我们做个选择:
    • 如果前一段的和 (cur) 是负数,那它就是个累赘,丢掉,让 nums[i] 自立门户。此时 cur = nums[i]
    • 如果前一段的和是正数,那它有增益效果,应该把它加上。此时 cur = cur + nums[i]
  3. 状态转移:以上可合并为 cur = max(nums[i], cur + nums[i])
  4. 更新结果:每一步都用 cur 更新全局 maxAns
C++ 代码实现
class Solution {
public:int maxSubArray(vector<int>& nums) {int cur=0,maxAns=nums[0];for(const auto &x:nums){cur=max(cur+x,x);maxAns=max(maxAns,cur);}return maxAns;}
};
复杂度
  • 时间复杂度: O(n),单次遍历。
  • 空间复杂度: O(1),常数空间。

进阶:分治法

分治法解决,复杂度 O(n log n) 不如动态规划的 O(n)

  1. 分解 (Divide):将数组从中间一分为二,分成左右两个子数组。
  2. 解决 (Conquer):递归地计算左子数组的最大子数组和 (left_max),以及右子数组的最大子数组和 (right_max)。
  3. 合并 (Combine):最大子数组和可能出现在三个地方:
    • 完全位于左子数组中(即 left_max)。
    • 完全位于右子数组中(即 right_max)。
    • 跨越中点。需要单独计算:从中点开始向左找最大和,再从中点开始向右找最大和,两者相加。
  4. 最终结果是这三者中的最大值。
class Solution {
public:int maxSubArray(vector<int>& nums) {}
};
http://www.lryc.cn/news/605124.html

相关文章:

  • 【Unity3D实例-功能-移动】复杂移动(Blend Tree方式)
  • JeecgBoot(1):前后台环境搭建
  • 【Excel】制作双重饼图
  • Linux设备驱动架构相关文章
  • 学习日志22 python
  • CUDA编程9 - 卷积实践
  • Python - 元类
  • 离散扩散模型在数独问题上的复现与应用
  • RAG工作流程总览
  • 解析非法获取计算机信息系统数据罪中的其他技术手段
  • 《超级秘密文件夹》密码遗忘?试用版/正式版找回教程(附界面操作步骤)
  • IATF 16949详解(腾讯混元)
  • Oracle11g数据库迁移达梦8数据库方案
  • 论文阅读|CVPR 2025|Mamba进一步研究|GroupMamba
  • 领域驱动设计(DDD)在分布式系统中的架构实践
  • cpp实现音频重采样8k->16k及16k->8k
  • 不同环境安装配置redis
  • 网络端口号全景解析:从基础服务到特殊应用的完整指南
  • 代码随想录算法训练营第三十六天
  • 【git】GitHub 的专用代理地址
  • day21-Excel文件解析
  • uvm-tlm-port-export-imp
  • 在VS2022中调试ASP.NET项目时修改DLL或ASPX动态页面的原理及实现方法
  • STM32CubeIDE新建项目过程记录备忘(二) GPIO输出demo:LED闪烁
  • 2025 IT专业人才培养趋势与职业发展指南:技术+数据复合型能力的构建路径
  • 【Kubernetes 指南】基础入门——Kubernetes 201(一)
  • OpenEuler 安装 apache + php8 不解析php文件的处理
  • 微信小程序中实现页面跳转的方法
  • Python奇幻之旅:从零开始的编程冒险
  • cpp-httplib 线程安全