返回一个整数数组中最大子数组的和(数组头尾连接)

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.截图

原文地址:https://www.cnblogs.com/xuqingtian/p/4584172.html