最大连续子序列和(动态规划 -- 经典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]开始重新寻找最长连续子序列;后面套用逻辑
'''