当前位置: 首页 > 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.xdnf.cn/news/1216981.html

相关文章:

  • Android Emoji 全面解析:从使用到自定义
  • 《嵌入式C语言笔记(十六):字符串搜索、动态内存与函数指针精要》
  • 企业微信API接口发消息实战:从0到1的技术突破之旅
  • MySQL索引和事务笔记
  • 2419.按位与最大的最长子数组
  • JAVAEE--4.多线程案例
  • Mac配置iterm2
  • 【动态规划 | 多状态问题】动态规划求解多状态问题
  • 信贷风控笔记8-解读商业银行资本管理办法笔记
  • Day 4-1: 机器学习算法全面总结
  • Vue路由钩子完全指南
  • 论文阅读|ArxiV 2024|Mamba进一步研究|VSSD
  • Python Pandas.concat函数解析与实战教程
  • 【力扣热题100】哈希——字母异位词分组
  • 20250730在荣品的PRO-RK3566开发板的Android13下调通敦泰的FT8206触控芯片【I2C的挂载】
  • colima 修改镜像源为国内源
  • 02 基于sklearn的机械学习-KNN算法、模型选择与调优(交叉验证、朴素贝叶斯算法、拉普拉斯平滑)、决策树(信息增益、基尼指数)、随机森林
  • MacTex+Vscode数学建模排版
  • VUE -- 基础知识讲解(二)
  • 计算机网络基础(二) --- TCP/IP网络结构(应用层)
  • 代码随想录算法训练营第三十六天
  • RHCA学习概述
  • Python 程序设计讲义(45):组合数据类型——集合类型:集合的常用操作
  • List 接口
  • nav2--安装/教程
  • Linux 系统进程管理与计划任务详解
  • 2025 年 NOI 最后一题题解
  • ORACLE的表维护
  • 学习Markdown
  • Python读取获取波形图波谷/波峰