最大子数组和——动态规划法

1、总结上一篇方法

       上一篇求解最大子数组用的是暴力求解法,把所有可能的子数组和求出来,然后比较得出最大的子数组和,这方法也是最容易想出来的,编程比较容易,感兴趣的同学可以看我的上一篇博客。

2、基于动态规划的最大子数组求和问题

        由于暴力求解的复杂度为O(n**3),确实有点大,那么不妨采用动态规划法求解,主要思路也很简单明了,我们假设最大和子数组由两部分组成,一个是前向和sum,另一个部分就是前向和sum的下一个元素,如果sum的值小于0就意味着它不可能成为最大子数组的一部分了,因此必须舍弃之前的sum,重新定义新的sum,这个sum的起始元素就是之前sum和序列的下一个元素。动态规划法简洁明了,时间复杂度仅为O(n),减少了求解次数。

3、代码样例

arr = [1,-2,3,4,-5]
def fun(arr):
    sum = arr[0]
    max = 0
    x = 0
    y = 0
    for i in range(1,len(arr)):

        if sum >= 0:
            sum += arr[i]
        else:
            sum = arr[i]
            x = i
        if sum > max:
            max = sum
            y = i
    if x>y:
        return arr[0:1]
    else:
        return arr[x:y+1]
if __name__=="__main__":
    print(fun(arr))

猜你喜欢

转载自blog.csdn.net/su_bao/article/details/80884299