Find the contiguous subarray within an array (containing at least one number) which has the largest sum.
For example, given the array [−2,1,−3,4,−1,2,1,−5,4],
the contiguous subarray [4,−1,2,1] has the largest sum = 6.
Practice
解法1:DP with O(N) 空间
用经典的DP思想可以解决,dp数组存的是以i结尾的前i个数字的max subarray,那么可以得到这样的递推关系
dp[i] = Max(dp[i - 1] + A[i], A[i])
意思就是说以i结尾的最大的子数组和要么是自己,要么是前一个子数组和加上自己。可以写出如下的代码
解法1优化: DP with O(1) 空间
观察上面的解法可以发现,实际上我们不需要维护一个数组来记录每一个点的最大和。
我们可以只维护一个变量sum,来记录从0到i的和。如果sum一旦小于0,那么对下一个dp数值的计算一定用不上sum,所以此时可以设置为0. 代码如下
解法2: 前缀和数组的思路,O(N) time + O(1) space
基本思想是:如果把数组中每一个元素都加起来,我们可以得到一个累积的和,那么这个问题实际上就变成了
best time to buy and sell stock I的问题,从左至右寻找最小的mininum sum,然后将当前的sum和minSum相减再和全局的最大值比较得出结果。
解法3:用Divide & Conquer思想:O(NlogN)
具体的思路是把原来的array一分为二,那么最大的子数组和一定是在1.左面的数组,2.右面的数组,3.跨越左面和右面的数组
左面和右面用递归的方式计算。跨越中点的数组一定包含mid point,往右面扫描找出最大的,往左面扫描找出最大的,最后比较三个数得出结果。