二维数组最大值首尾相连

题目要求:

返回一个整数数组中最大子数组的和。

输入一个整形数组,数组里有正数也有负数。

数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。

如果数组A[0]……A[j-1]首尾相邻,允许A[i-1],…… A[n-1],A[0]……A[j-1]之和最大。
同时返回最大子数组的位置。

设计思路:

数组首尾相连,可在任意位置将数组剪断,然后将剪断位置之前的数组数据按照顺序接在原数组之后形成新数组。然后开始遍历数组,同时设置N让N的最大值为原数组长度,使得遍历时最大子数组长度不会超出原长度。

源代码:

#include <iostream>
using namespace std;
#define N 1000
int main(int argc, char* argv[])
{
    int arry[N];
    int length=1;
    int max[N],max1;
    int maxweizhi[N];
    int num=0;
    int value( int arry[],int length);
    cout<<"请输入数组:"<<endl;
    cin >> arry[0];
    while (getchar() != '\n')   
    {
        cin >> arry[length];
        length++;
    }
  
     for(int j=length;j<2*length-1;j++)  
    {
        arry[j]=arry[num];
        num++;
    }
 
    cout<<"由这几个数形成的环形数组";
    value(arry,2*length-1);
    return 0;
}
int value( int arry[],int length)
{
    int max[N],max1;
    int maxweizhi[N];
    for(int j=0;j<(length+1)/2;j++)
    {
        int sum=0;
        max1=-99999;                  
        int z=0;
        for(int i=j;i<(length+1)/2+j;i++)  
        {
            sum=sum+arry[i];
            if(sum>=max1)
            {
                max1=sum;
                z++;
            }
        }
        max[j]=max1;
        maxweizhi[j]=z;
    
    }
    int fmax=max[0];
    int q=0;
    for(int i=0;i<(length+1/2);i++) 
    {  
        if(max[i]>fmax)
        {
            fmax=max[i];
            q=i;
        }
    }
 
    int weizhi=maxweizhi[q];
 
    cout<<"最大子数组的和为:"<<endl;
    for(int num=q;num<q+weizhi;num++) 
    {
        cout<<arry[num];
    }
 
    cout<<"最大子数组的和为:  "<<fmax<<endl;
    return 0;
}

结组人:倪彤炜 谷豪磊

猜你喜欢

转载自www.cnblogs.com/oliverqueen/p/9904330.html