题目
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
.
If you have figured out the O(n) solution, try coding another solution using the divide and conquer approach, which is more subtle.
思路
数组的最大子段和问题(连续的一段子数组)
动态规划:
令b[j] = MAX { Sum(A[i]+...+A[j]) } 1<=j<=n
1<=i<=j
所以 如果b[j-1]>0 , b[j] = b[j-1]+A[j] ; 否则 b[j] = A[j] 。
代码一
class Solution {
public:
int maxSubArray(int A[], int n) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int sum = A[0];
int b = A[0];
for(int i=1;i<n;i++)
{
if(b>0)
b += A[i];
else
b = A[i];
if(b>sum)
sum = b;
}
return sum;
}
};
代码二
对于b[j] = max { max{ b[j-1]+A[j] , A[j] } , A[j] }
class Solution {
public:
int maxSubArray(int A[], int n) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int sum = A[0];
int b = A[0];
for(int i=1;i<n;i++)
{
b = max(b+A[i],A[i]);
b = max(b,A[i]);
if(b>sum)
sum = b;
}
return sum;
}
};