给定一个整数数组 nums
,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:
输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
进阶:
如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。
【思路】
求数组中最大子序列的和,可以遍历每一个数组元素,找到以这个元素结尾的最大子序列,然后就变成了n个数求最大值,比当前max大的再更新。那么问题就在于怎么求以每个元素的结尾的最大子序列。每个元素结尾的子序列要么是它本身,要么是加上它前面的子序列们。我们只需要找到之前子序列中的最大的,如果是负数或0那当前最大子序列就是元素本身,如果是正数,那就是加上它成为当前下标的最大子序列。然后不断向前推进。
这个算法又称为Kadane算法,它是又美国卡耐基梅隆大学的教授Kadane发明的一种用于求解最大连续子序列和问题的最优算法。对于一个长度为n的数组A而言,从A[0] 到 A[j] 是一个子数组(j<n),那么以A[j]结尾的子数组之最大和,要么是 A[j], 要么是 max(A[i]~A[j-1])+A[j] ,其中0 ≤ i ≤ j-1。这就是该算法设计的出发点。