上一篇求解最大子数组用的是暴力求解法,把所有可能的子数组和求出来,然后比较得出最大的子数组和,这方法也是最容易想出来的,编程比较容易,感兴趣的同学可以看我的上一篇博客。
由于暴力求解的复杂度为O(n**3),确实有点大,那么不妨采用动态规划法求解,主要思路也很简单明了,我们假设最大和子数组由两部分组成,一个是前向和sum,另一个部分就是前向和sum的下一个元素,如果sum的值小于0就意味着它不可能成为最大子数组的一部分了,因此必须舍弃之前的sum,重新定义新的sum,这个sum的起始元素就是之前sum和序列的下一个元素。动态规划法简洁明了,时间复杂度仅为O(n),减少了求解次数。
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))