首页 > 学院 > 开发设计 > 正文

Maximum Subarray

2019-11-06 06:55:46
字体:
来源:转载
供稿:网友
问题:

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;}


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表