当前位置: 首页 > 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.dtcms.com/a/306120.html

相关文章:

  • 明智运用C++异常规范(Exception Specifications)
  • AI 驱动的软件测试革新:框架、检测与优化实践
  • 洛谷刷题7.30
  • 【力扣热题100】哈希——最长连续序列
  • Redis知识点(2)
  • Kong API Gateway的十年进化史
  • Git提交代码完整流程
  • 创建两个 C 语言文件,实现使用共享内存和信号量集进行两个进程间的双向聊天功能。这两个文件分别为chat1.c和chat2.c,它们可以互相发送和接收消息。
  • Web3:以太坊虚拟机
  • 【HarmonyOS】鸿蒙ArkWeb加载优化方案详解
  • 智慧城市SaaS平台|市政公用管理系统
  • 不可变类字段修复建议
  • 21. mysql redo 日志(下)
  • 模型选择与调优:从交叉验证到网格搜索的实践
  • 亚马逊广告进阶指南:如何优化流量实现新品快速起量
  • sqli-labs:Less-7关卡详细解析
  • NAT技术与代理服务
  • Jenkinsfile 报错
  • Elasticsearch服务器开发(第2版) - 读书笔记 第二章 索引
  • Docker常用命令速查手册:容器运维七维指南
  • Jupyter Notebook 中显示图片、音频、视频的方法汇总
  • arkui 动画曲线
  • react19更新哪些东西
  • vue3【组件封装】信息管理 S-comMangeInfo (含多条件搜索、分页表格、自带增删改查、重置密码等)
  • Java面试宝典:MySQL InnoDB引擎底层解析
  • VS调试前端项目时老是弹出Chrome无法更新的提示
  • 防抖(debounce)和节流(throttle)实现及原理讲解
  • dify离线插件打包步骤
  • Apache Ignite 与 Spring Data 集成
  • Electron + Fabric 打包遇到error LNK2001