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
.
class Solution {
public:
int maxSubArray(int A[], int n) {
int sum=A[0], cur_sum=INT_MIN;
for(int i=0; i<n; ++i){
if(cur_sum<0)
cur_sum=A[i];
else
cur_sum+=A[i];
if(sum<cur_sum)
sum=cur_sum;
}
return sum;
}
};
注意:sum=A[0] 是为了避免A中只有一个元素的情况,cur_sum的初始值应该为 int_min,防止 sum<cur_sum 在不该成立时成立。
题目最后提到了分治法解决会很巧妙,于是在Discuss里看到某大神的分治法讲解。思路如下:
1、单独写一个计算函数,首先计算middle索引,递归调用本函数计算(left,middle-1)和(middle+1,right);
2、针对middle处的元素,一共有两种情况:最终的sum不包含它/包含它。
3、从middle开始,向left方向走,计算出此方向上的最大和;然后从middle向right方向走,计算出最大和;将二者加和就是包含middle值的最大和;
4、比较包含middle的最大和与1中计算出的middle左侧、右侧最大和,返回其中的最大值即可。
复杂度:T(n)=2T(n/2)+n, 为O(n*lgn)。不如 O(n)的快。