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

最大连续子序列和(动态规划 -- 经典Kadane算法)

如果采用暴力枚举,面对大规模数据会暴雷


!推荐使用经典Kadane算法:

        大致思想:

1、用nums[0]初始化 current_max 和 global_max

2、用max(nums[i] , nums[i] + current_max])进行判断是否要更换连续序列的开头(理解关键)



举个例子:       

        # 最开始我们从 nums[0] 开始寻找,假设 nums[1] > nums[0] + 1:

        # 那么我们从 nums[1] 开始重新寻找最长连续子序列,而不是之前的从 nums[0]开始寻找满足条件的连续序列;后续套用逻辑

# 经典方法:Kadane 算法(动态规划思想)

# 连续子序列指的是数组中连续的一段
# 重点是理清两个max的关系


def max_subarray_sum(nums):
    global_max = current_max = nums[0]
    for i in range(1, len(nums)):
        current_max = max(nums[i], current_max + nums[i]) 
        global_max = max(global_max, current_max) # 时刻更新global_max, 也可以使用if判断替代
    return global_max

nums = [-2,1,-3,4,-1,2,1,-5,4]
print(max_subarray_sum(nums))  

'''
关键理解:
        current_max = max(nums[i], current_max + nums[i]) 
        # 最开始我们从nums[0]开始寻找,假设nums[1] > nums[0] + 1:
        # 那么我们从nums[1]开始重新寻找最长连续子序列;后面套用逻辑

'''


 


http://www.kler.cn/a/600817.html

相关文章:

  • 可视化工程项目管理软件:让复杂工程数据一目了然
  • rabbitmq承接MES客户端服务器
  • sourcetree中的“master“,“origin/master“,“origin/HEAD“这三个图标都是什么意思?GIT 超详细➕通俗易懂版本
  • influxdb在centOS stream 9安装教程
  • 3、孪生网络/连体网络(Siamese Network)
  • <KeepAlive>和<keep-alive>有什么区别
  • 基于51单片机的多点位水位监测proteus仿真
  • Java学习总结-Stream流
  • 微信小程序中使用WebSocket通信
  • 使用Python爬虫获取1688商品(按图搜索)接口
  • 状态空间模型解析 (State-Space Model, SS)
  • 人工智能与区块链融合:开启数字信任新时代
  • (一)LeetCode热题100——哈希
  • 家庭网络结构之局域网通信
  • 监控告警+webhook一键部署
  • PAT乙级1007
  • jvm中每个类的Class对象是唯一的吗
  • 万字C++STL——vector模拟实现
  • Linux中的基本开发工具(上)
  • 基于Spring Boot的党员学习交流平台的设计与实现(LW+源码+讲解)