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

1.题目。

题目:返回一个整数数组中最大子数组的和。
要求:
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大。
同时返回最大子数组的位置。
求所有子数组的和的最大值。要求时间复杂度为O(n)。

2.设计思路。

将随机产生的数连续的存入数组两次,在从第一个开始,分别求出它所有子数组的和,进行比较。求出最大最大子数组。

3.代码。

#include<iostream>
using namespace std;
#include <ctime>
#include <cstdlib>
#define MAX 10000
int main()
{
    int k,a[MAX],b[MAX],m,n=0,p,c,d;
    cout<<"请输入数组的个数:"<<endl;
    cin>>k;
    srand(time(0));
    cout<<endl;
    cout<<"该数组中数字为:"<<endl;
    for(int i=0;i<k;i++)
    {
        a[i+k]=a[i]=rand()%100-50;
        cout<<a[i]<<" ";
        
    }
    cout<<endl;
    cout<<endl;
    for(i=0;i<k;i++)
    {
        m=a[i];
        b[n]=m;
        n++;
        for(int j=i+1;j<i+k;j++)
        {
            m=m+a[j];
            b[n]=m;
            n++;
        }
    }
    int max=b[0];
    for(i=1;i<n;i++)
    {
        if(max<b[i])
        {
            max=b[i];
            p=i+1;
        }
    }
    // p=p+1;
    cout<<"最大子数组的值为:";
    cout<<max<<endl;
    cout<<endl;
    c=p/k;
    d=p%k;
    cout<<"最大子数组为:";
    for(i=c;i<c+d;i++)
        cout<<a[i]<<" ";
    cout<<endl;
    return 0;
}

4.运行结果。

5.体会。

结对开发可以加快编程速度,更快、更好的完成实验编程。

 6.照片。

 
原文地址:https://www.cnblogs.com/nulidexuezha/p/4378485.html