题目要求:
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
.
More practice:
If you have figured out the O(n) solution, try coding another solution using the divide and conquer approach, which is more subtle.
O(n)代码:
#include"stdafx.h"
#include <iostream>
using namespace std;
class Solution {
public:
int maxSubArray(int A[],int n)
{
if(n==0)
return 0;
int result=A[0];
int Max_i=A[0];
for(int i=1;i<n;i++)
{
Max_i=max(Max_i+A[i],A[i]);
result=max(Max_i,result);
}
return result;
}
};
void main()
{
int A[9]={-1,2,3,4,5,0,7,11,10};
Solution s;
cout<<s.maxSubArray(A,9)<<endl;
getchar();
}
分冶代码:
#include"stdafx.h"
#include <iostream>
using namespace std;
class Solution {
public:
int maxSubArray(int A[],int n)
{
return findMaxSub(A,0,n-1);
}
int findMaxSub(int A[],int low,int high)
{
if(low==high)
return A[low];
int mid=(low+high)/2;
int lmax=findMaxSub(A,low,mid);
int rmax=findMaxSub(A,mid+1,high);
int midmax=A[mid];
int sum=0;
for(int i=mid;i>=low;i--)
{
sum+=A[i];
if(sum>midmax)
midmax=sum;
}
sum=midmax;
for(int i=mid+1;i<=high;i++)
{
sum+=A[i];
if(sum>midmax)
midmax=sum;
}
return max(max(lmax,rmax),midmax);
}
};
void main()
{
int A[9]={-1,2,3,4,5,0,7,11,10};
Solution s;
cout<<s.maxSubArray(A,9)<<endl;
getchar();
}