• 结对开发之环形数组


    一、题目与要求

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

     
    二、设计思路

      1、在上一次求一维数组最大子数组的问题上,进行拓展,继续使用类似的求和方法

         2、应题目要求,这次的一位数组要首尾相连,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大,所以我们采用课上的方法寻找最大值,将数组的元素进行扩展,即把数组除最后一个元素外从新拼接到尾部,形成一个环。

    三、源代码

     #include <iostream.h>
     #define N 1000 
     int main(int argc, char* argv[])
     {
         int arry[N];
         int length;
    	 int max[N],max1;
         int maxweizhi[N];
         int value( int arry[],int length);
         cout<<"请输入要比较整数的个数:"<<endl;
         cin>>length;
         cout<<"请输入整数"<<endl;
         for(int i=0;i<length;i++)
         {
             cin>>arry[i];    
         }
          
         int num=0;
         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=-9999999;
             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;
     }
    

    四、运行结果

    五、总结

         通过此次实验,我认识到团结的力量。刚开始,我和小伙伴都没有思路,在课堂上,经过同学和老师的启发,对求解方法有了思路。这也让我们在课下编程

    省了不少功夫。通过这次实验,也反思自己存在的问题。别人可以想出简单的方法,我们想不出来的原因在于练习的少,遇到和解决问题的机会也少。所以,还

    是需要多多练习。每次解决问题后,都应该及时的反思总结,将方法求解归总,不断积累。

  • 相关阅读:
    netbeans 打开项目时没有出现咖啡哪个标记
    java swing客户端程序调试的一些方式
    java客户端布局 GroupLayout 控件、按钮等布局
    ActiveMQ 增加消息 消费消息
    HBase学习解析之起源.md
    Hadoop学习解析之资源管理调度框架YARN
    Hive学习解析之工作原理.md
    Hive学习解析之系统架构.md
    js实现ajax获取的文件base64字符串处理.md
    springboot2.x整合quartz2.x.md
  • 原文地址:https://www.cnblogs.com/yuji5656/p/4376594.html
Copyright © 2020-2023  润新知