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

【LeetCode 53】最大子数组和(Maximum Subarray)题解

一、题目描述

给你一个整数数组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 <= 10^5

  • -10^4 <= nums[i] <= 10^4

进阶:

如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。


二、解题分析

题目要求找出一个数组中和最大的连续子数组,这是一个经典的动态规划问题,也称为Kadane 算法

核心思想:

  1. currSum记录以当前元素结尾的最大子数组和。

  2. 遍历数组,对于每一个元素:

    • 如果currSum为负数,则从当前元素重新开始;

    • 否则,将当前元素加入currSum

  3. maxSum记录遍历过程中遇到的最大值。

动态规划转移方程:

currSum = max(nums[i], currSum + nums[i]) maxSum = max(maxSum, currSum)

这里,currSum表示“以 nums[i] 结尾的最大连续子数组和”。


三、代码实现(C语言)

#include <stdio.h> int maxSubArray(int* nums, int numsSize) { if (numsSize == 0) return 0; int maxSum = nums[0]; // 全局最大子数组和 int currSum = nums[0]; // 以当前元素结尾的子数组和 for (int i = 1; i < numsSize; i++) { // 如果累加和为负数,从当前元素重新开始 if (currSum < 0) { currSum = nums[i]; } else { currSum += nums[i]; } // 更新全局最大值 if (currSum > maxSum) { maxSum = currSum; } } return maxSum; } // 测试 int main() { int nums[] = {-2,1,-3,4,-1,2,1,-5,4}; int size = sizeof(nums)/sizeof(nums[0]); printf("最大子数组和: %d\n", maxSubArray(nums, size)); return 0; }

运行结果:

最大子数组和: 6

四、复杂度分析

  • 时间复杂度:O(n)
    遍历数组一次即可。

  • 空间复杂度:O(1)
    只需常数空间保存currSummaxSum


五、进阶解法:分治法(Divide and Conquer)

除了动态规划,还可以使用分治法解决:

  1. 将数组分为左右两半。

  2. 最大子数组和可能出现在:

    • 左半部分

    • 右半部分

    • 跨越中间

  3. 递归求解左右两部分的最大值,再求跨越中间的最大值。

时间复杂度:O(n log n)
空间复杂度:O(log n) 递归栈空间

分治法思想非常经典,但实际面试中,Kadane 算法即可满足要求,且更高效。


六、总结

  • 本题是典型的动态规划/Kadane算法问题。

  • 核心在于“当前累加和为负数时,从当前元素重新开始”。

  • 面试中,掌握动态规划思路即可,分治法为进阶拓展。

  • 复杂度分析简单,O(n) 时间、O(1) 空间,非常优雅。


http://www.jsqmd.com/news/616631/

相关文章:

  • Youtu-Parsing开源文档解析模型详解:像素级定位+RAG就绪JSON/Markdown输出
  • Ostrakon-VL-8B入门:Anaconda创建独立Python环境避免依赖冲突
  • YOLOv12官版镜像实战:手把手教你验证COCO数据集,小白也能轻松上手
  • OpenClaw配置文件详解:对接百川2-13B-4bits量化模型的最佳实践
  • Qwen3-ASR-0.6B部署案例:广电媒体素材库语音元数据自动打标系统
  • 手把手教你用Phi-4-mini-reasoning搭建智能解题助手:从部署到实战
  • OpenClaw配置备份:千问3.5-9B模型切换无忧方案
  • SecGPT-14B效果展示:对Splunk SPL查询语句进行安全语义解释与优化建议
  • SiameseAOE模型效果深度评测:多领域文本抽取能力对比
  • LeetCode 207|课程表(Course Schedule)题解 – 拓扑排序判环法
  • Qwen3.5-2B部署教程:WSL2环境下Windows用户一键运行图文模型
  • VSCode下载与配置Starry Night Art Gallery开发环境
  • C++易搞混知识: 指针、引用与取地址运算符对比分析
  • 专家答辩:视频不再是监控:基于三维空间智能体的空间计算系统构建与应用
  • Qwen3-Embedding-4B新手指南:可视化界面,轻松玩转文本向量化
  • OpenClaw技能市场指南:为千问3.5-9B寻找合适的功能扩展
  • LeetCode 210 课程表 II | 拓扑排序详解(C语言实现)
  • Swoole 5.0适配踩坑实录,深度解析协程生命周期变更、内存管理新规与RPC协议不兼容问题
  • OpenClaw+Qwen3-14B内容工厂:自动生成技术博客与SEO优化
  • VibeVoice实时语音合成实战:25种音色一键切换,打造多语言语音助手
  • nanobot超轻量级AI助手部署实测:快速体验Qwen3-4B模型的智能回复
  • [具身智能-314]:大语言模型处理文本的全过程
  • 镜像视界VS 专家 :空间计算系统最刁钻10问 + 答案
  • 一键部署实时口罩检测-通用:基于Gradio的交互式Web界面快速上手
  • Lychee-Rerank安全加固指南:防止注入攻击与数据泄露
  • Fish-speech-1.5多语言支持实战:13种语言的语音合成技巧
  • 2026年12VDC通讯设备电磁开关/家电用电磁开关多家厂家对比分析 - 品牌宣传支持者
  • 镜像视界数字孪生空间系统:二轮追问反杀清单
  • 5分钟玩转像素语言·跨维传送门:腾讯混元引擎翻译工具实测
  • Ostrakon-VL 终端 Anaconda 虚拟环境管理:多项目 Python 依赖隔离指南