首尾相连的循环数组求其子数组最大值

结对成员

  曹坤  翟凯

题目

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

要求:

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

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

  如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大。

  同时返回最大子数组的位置。

思路

  经过讨论,只需将数组扩展为2倍长度,array[i]=array[length+i];从第一个元素开始依

次五个元素为一组,共分为五组进行;分别求得五个最大子数组和,然后求其最大值。这种方法

很容易解决问题,但是分组的个数就是元素的个数,即需要循环计算length次 。   不过,我偶

然间发现,最大子数组的第一个元素之前的元素一定是负数,否则整个数组全为正数,所以一个

在元素足够大的循环数组中,有一个比较节省计算量的方法,就是只需考虑负数元素的后一个元

素是否为正数,如果为正数则以此元素开始五个元素组成数组计算其最大值,即循环计算的次数

与负数的个数有关而无需循环length次。

代码

#include<iostream>
#include<conio.h>
#include<ctime>
#define Max_Length 10
using namespace std;
int main()
{ 
    srand((unsigned)time(NULL)); 
    int * arr=new int[2*Max_Length];
    int result=0,r,sum,k=0,l=0,g=0,a,b=0,flag=0;
    int randoms,count1=0,count2=0,c1=0,c2=0;
    
    while(1)
    {
        cout<<"随机产生"<<Max_Length<<"个数值:\n"<<endl;
        for ( int i=0; i<Max_Length; i++ ) {
            randoms = ( -rand()%100 + ( rand()%100 ));
            arr[i] = arr[i+Max_Length] = randoms;
            cout<<"数组元素"<<i+1<<"分别为:"<<arr[i]<<endl;
        }

        for(int s=0; s<Max_Length; s++) {
            
            if(arr[s]<0 && g==s) {
                g++;
                if(a<arr[s])
                {
                    a=arr[s];
                }
                if(g==Max_Length)
                {
                    cout<<"最大数组之和:"<<a<<endl<<endl;
                }
            }
            if(arr[s]>0 && l==s) {
                l++;
                b+=arr[s];
                if(l==Max_Length)
                {
                    cout<<"最大数组之和:"<<b<<endl<<endl;
                }
            }

            if(arr[s]<0 && arr[s+1]>=0) {
                flag=1;
                r=arr[s+1];
                sum=0;
                for ( int t=0,j=s+1; j<s+Max_Length+1; j++ ) {
                    t++;
                    if ( sum>=0 )
                    { sum+=arr[j]; }
                    else 
                    { c1=j; sum=arr[j]; }
                    if( r < sum ) {
                        count1=c1;
                        count2=c2;
                        r=sum;    
                    }
                }
                if(result<r)
                {
                    result=r;

                }
                
            }
        }
        if(flag==1)
            cout<<"最大数组之和3:"<<result<<endl<<endl;
        result=a=b=arr[0];
        getch();
    }
    return 0;
}

截图

总结
我和同伴其实早就想到之前的解决方法了,这个是我自己最后想到的,在数组元素足够大时,

会有效地节省计算的次数。所以我认为,方法总是有的,但要找到更好的方法需要多思考才行。

  

 

转载于:https://www.cnblogs.com/bill927/p/4381879.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值