返回一个整数数组中最大子数组的和(数组头尾连接)
1.题目。
题目:返回一个整数数组中最大子数组的和。
要求:
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大。
同时返回最大子数组的位置。
求所有子数组的和的最大值。要求时间复杂度为O(n)。
2.设计思路。
将随机产生的数连续的存入数组两次,在从第一个开始,分别求出它所有子数组的和,进行比较。求出最大最大子数组。
3.代码。
1 #include<iostream> 2 using namespace std; 3 #include <ctime> 4 #include <cstdlib> 5 #define MAX 10000 6 int main() 7 { 8 int k,a[MAX],b[MAX],m,n=0,p,c,d; 9 cout<<"请输入数组的个数:"<<endl; 10 cin>>k; 11 srand(time(0)); 12 cout<<endl; 13 cout<<"该数组中数字为:"<<endl; 14 for(int i=0;i<k;i++) 15 { 16 a[i+k]=a[i]=rand()%100-50; 17 cout<<a[i]<<" "; 18 19 } 20 cout<<endl; 21 cout<<endl; 22 for(i=0;i<k;i++) 23 { 24 m=a[i]; 25 b[n]=m; 26 n++; 27 for(int j=i+1;j<i+k;j++) 28 { 29 m=m+a[j]; 30 b[n]=m; 31 n++; 32 } 33 } 34 int max=b[0]; 35 for(i=1;i<n;i++) 36 { 37 if(max<b[i]) 38 { 39 max=b[i]; 40 p=i+1; 41 } 42 } 43 // p=p+1; 44 cout<<"最大子数组的值为:"; 45 cout<<max<<endl; 46 cout<<endl; 47 c=p/k; 48 d=p%k; 49 cout<<"最大子数组为:"; 50 for(i=c;i<c+d;i++) 51 cout<<a[i]<<" "; 52 cout<<endl; 53 return 0; 54 }
4.截图