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

leetcode 53. 最大子数组和

你描述的是解决最大子数组和问题的动态规划方法,也被称为Kadane算法。这种方法通过状态转移方程高效地找到连续子数组的最大和。

方法思路

  1. 定义状态:设f(i)表示以第i个元素结尾的连续子数组的最大和。
  2. 状态转移:对于每个元素nums[i],有两种选择:
    • 将其加入前面的子数组,和为f(i-1) + nums[i]
    • 以自身作为新的子数组起点,和为nums[i]
      取两者中的较大值作为f(i),即f(i) = max(f(i-1) + nums[i], nums[i])
  3. 全局最优解:遍历所有f(i),找出最大值。

优化思路

由于f(i)只依赖于f(i-1),可以使用一个变量pre来维护当前的f(i-1),从而将空间复杂度从O(n)优化到O(1)。

算法实现

以下是使用Python实现的Kadane算法:

def maxSubArray(nums):n = len(nums)if n == 0:return 0pre = nums[0]  # 初始化pre为第一个元素max_sum = nums[0]  # 初始化最大和为第一个元素for i in range(1, n):# 更新pre为当前元素和(前一个状态+当前元素)中的较大值pre = max(nums[i], pre + nums[i])# 更新全局最大和max_sum = max(max_sum, pre)return max_sum# 示例用法
nums = [-2, 1, -3, 4, -1, 2, 1, -5, 4]
print(maxSubArray(nums))  # 输出: 6,对应的子数组是[4, -1, 2, 1]

复杂度分析

  • 时间复杂度:O(n),只需遍历数组一次。
  • 空间复杂度:O(1),只需要常数级的额外空间。

这种方法高效且简洁,是解决最大子数组和问题的最优解法。

相关文章:

  • 【分治】计算右侧小于当前元素的个数
  • 基于深度学习双塔模型的食堂菜品推荐系统
  • Tailwind css实战,基于Kooboo构建AI对话框页面(二)
  • 【leetcode】209. 长度最小的子数组
  • 深度学习————注意力机制模块
  • 「Python教案」循环语句的使用
  • 纯C++ 与欧姆龙PLC使用 FINS TCP通讯源码
  • 【Python训练营打卡】day37 @浙大疏锦行
  • 如何寻找大模型在企业业务中的价值?
  • 蓝桥杯b组c++赛道---字典树
  • IPv4地址的主要配置项介绍
  • 语音识别算法的性能要求一般是多少
  • 基于多流特征融合与领域知识整合的CNN-xLSTM-xAtt网络用于光电容积脉搏波信号的无创血压估计【代码已复现】
  • Matlab中gcb、gcbh、gcs的区别
  • Cursor 与DeepSeek的完美契合
  • 实时同步缓存,与阶段性同步缓存——补充理解《补充》
  • OpenCV 图像像素的读写操作
  • leetcode hot100刷题日记——18.搜索插入位置
  • PCB设计自检表
  • SAAS架构设计2-流程图-注册流程图
  • 做网站哪些网络公司好/整站优化包年
  • 做网站的广告图片/seo成功案例分析
  • 关于做美食的网站/自助建站系统平台
  • 武汉专业的网站建设公司/建一个企业网站多少钱
  • WordPress的目录大纲/保定seo排名
  • 网站的mysql数据库放到服务器上服务器需要安装mysql吗?/推广技巧