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

最大连续子序列和(动态规划 -- 经典Kadane算法)_第1张图片如果采用暴力枚举,面对大规模数据会暴雷


!推荐使用经典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]开始重新寻找最长连续子序列;后面套用逻辑

'''


 

你可能感兴趣的:(动态规划,算法,kadane算法,python)