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
.
解决方法:
已经有人提出了O(n)的解决方法,答题思路是,对于数组中第一个元素a[0]与最大的一段数组(a[i]```a[j]),有三种情况:
1.i=j=0,即a[0]为最大的一段;
2.0=i<j,和最大的一段以a[0];
3.0<i,和最大的一段为(a[i]```a[j])。
用递推方式解决问题。函数为类中的maxSubArray(vector<int>& nums)。
若用分形算法来做,可将a[0]```a[n-1]分成a[0]```a[(n-1)/2]和a((n+1)/2)```a[n-1]两部分,首先分别求出他们的和最大值max1,max2,整个数组的和最大值可能等于max(max1,max2),或者和最大子段跨越两个数组,分别求出第一段中以a[(n-1)/2]结尾的和最大值,第二段中以a((n+1)/2)为首的和最大值,令max3为他们的和,则整个数组的和最大值为max{max1,max2,max3}.
分形算法的复杂度为O(n log n)。函数为类中的maxSubArray1(vector<int>& nums).
完整的代码如下:
#include<iostream>
#include<vector>
#include<algorithm>
#include<numeric>
#include <math.h>
using namespace std;
class Solution {
public:
int maxSubArray(vector<int>& nums);
int maxSubArray1(vector<int>& nums);
};
int Solution::maxSubArray(vector<int>& nums)
{
int x;
int i;
//while(cin>>x&&x!='p')//输入数组中元素,输入p为结束
//{
// nums.push_back(x);
cin>>x;
//}
//
int t=nums.size();
int nstart=nums[t-1];
int nall=nums[t-1];
for(i=t-2;i>=0;i--)
{
if(nstart<0)
nstart=0;
nstart+=nums[i];
if(nstart>nall)
nall=nstart;
}
//cout<<nall<<endl;
return nall;
}
int Solution::maxSubArray1(vector<int>& nums)
{
//int w;
// while(cin>>w&&w!='p')//输入数组中元素,输入p为结束
//{
// nums.push_back(w);
cin>>x;
//}
int len=nums.size();
double l=((double)len)/2;
int t=ceil(l);
int x,y,z;
int sum1,sum2;
int max1,max2,max3;
if(len==1)
return nums[0];
else
{
vector<int>::iterator it1=nums.begin();
vector<int>::iterator it2=nums.begin()+t;
vector<int> nums1(it1,it2);
it1=nums.begin()+t;
it2=nums.end();
vector<int> nums2(it1,it2);
x=maxSubArray1(nums1);
y=maxSubArray1(nums2);
x=(x>y)?x:y;
max1=sum1=nums[t-1];
max2=sum2=nums[t];
for(int i=t-2;i>=0;i--)
{
sum1+=nums[i];
max1=(max1>sum1)?max1:sum1;
}
for(int i=t+1;i<len;i++)
{
sum2+=nums[i];
max2=(max2>sum2)?max2:sum2;
}
max3=max1+max2;
x=(x>max3)?x:max3;
//cout<<x<<endl;
return x;
}
}
int main()
{
vector<int> nums;
Solution s;
int w;
while(cin>>w&&w!='p')//输入数组中元素,输入p为结束
{
nums.push_back(w);
// cin>>x;
}
cout<<s.maxSubArray1(nums)<<endl;
return 0;
}