zoukankan      html  css  js  c++  java
  • 返回一个整数数组最大子数组的和

    开始时间:14:00

    结束时间:17:   20

    要求

    1,程序可以处理1000个元素;

    2,每个元素是int32类型的;

    3,整型数组有正数也有负数;

    4,可以求出所有子数组的和的最大值,时间复杂度为O(n)

     5,小组成员:于芳娜,张素颖

    设计思路

    1,

    如果不考虑时间复杂度,我们可以枚举出所有子数组并求出他们的和。不过非常进憾的是,由于长度为n的数组有O(n^2)个子数组,而且求一个长度为n的数组的和的时间复杂度为O(n).

    因此这种思路的时间是O(n^3).

    2,

    很容易理解,当我们加上一个正数时,和会增加,当我们加上一个负数时,和合减少,如果当前得到的和是个负数,那么这个和在接下来的累加中应该抛弃并重新清零。

    不然的话这个负数将会减小接下来的和。

    3,

    调用随机函数rand(),srand()生成随机数组。

    1 //2018.10.14
     2 //组内成员:于芳娜,张素颖
     3 //返回一个整数数组最大子数组的和
     4 #include<iostream>
     5 #include<time.h>
     6 #include<stdlib.h>
     7 using namespace std;
     8 int MaxSum(int data[],int length,int &start,int &end)
     9 {
    10     int max=data[0];
    11     int starttemp=0,endtemp=0;//定义开始和结束位置
    12     int cursum=0;//定义元素和
    13     if(data==NULL||length<0)
    14     {
    15        return 0;
    16     }//数组为空的处理
    17     for(int i=0;i<length;i++)
    18     {
    19         if(cursum<=0)//数组元素和小于零时,重置为第i个元素
    20         {
    21             cursum=data[i];
    22             starttemp=i;
    23             endtemp=i;
    24         }
    25         else
    26         {
    27             cursum+=data[i];//数组元素大于零时,累加
    28             endtemp=i;
    29         }
    30         if(cursum>max)//当前和大于最大和,则重置最大和
    31         {
    32             max=cursum;
    33             start=starttemp;//子数组元素开始及结束位置
    34             end=endtemp;
    35         }
    36     }
    37         return max;
    38 }
    39 int main()
    40 {
    41     int n;
    42     cout << "Number of elements in array:" << endl;
    43     cin >> n;
    44     srand((unsigned)time(NULL));//实现不同随机数的生成
    45     int data[n];
    46     {
    47         for(int j=0;j<n;j++)
    48         {
    49             data[j]=rand()%2001-1000;
    50             cout<<data[j]<<" ";
    51         }//输出-1000到1000的1000个随机数
    52     }
    53     int length=sizeof(data)/sizeof(int);//数组长度计算
    54     int start=0,end=0;
    55     int result=MaxSum(data,length,start,end);//调用函数
    56     cout << endl;
    57     cout<<"MaxOfSubarrays="<<endl;
    58     for(int i=start;i<=end;i++)
    59         cout<<data[i]<<" ";//输出最大子数组
    60     cout<<endl;
    61     cout<<"MaxSumOfSubarrays="<<" "<<endl;
    62     cout<<result<<endl;//输出最大子数组的和
    63     return 0;
    64 }

    设计过程中遇到的问题

    1,初始阶段,没有明确的设计思路可以将最大子数组的和表示出来,以至于设计出的代码仅仅只适用于一两个数组,不能做到很好的泛化。

    解决方案:查阅并借鉴相关资料,完善自己的设计思路。

    2,随机数的生成过程之中,不知道生成负的随机数的方法

    解决方案:查阅并借鉴相关资料,扩大了生成随机数的范围。

    3,代码写完之后存在多处运行错误

    解决方案:逐一调试。

    运行截图

    对于子数组之和大于整型表示的最大范围时出现情况的观察

     把生成随机数的位数放大至1*10^20---2*10^20,会出现以下情况:

     

     总结

     这是第一次由两个人共同完成一个编程,在编程过程之中分工明确,共同解决一些技术上的难题,体会到对各种函数的使用和编写还不是特别熟练,容易出现卡壳现象,

    今后会多读一些程序代码,提高自己的编程能力。

    小组成员合照

  • 相关阅读:
    HAproxy 1.5 dev14 发布
    IBM/DW 使用 Java 测试网络连通性的几种方法
    Skype 4.1 Linux 发布,支持微软帐号登录
    Dorado 7.1.20 发布,Ajax的Web开发平台
    Aspose.Slides for Java 3.0 发布
    开发版本 Wine 1.5.18 发布
    BitNami Rubystack 开始支持 Ruby 2.0
    XWiki 4.3 正式版发布
    Silverlight实例教程 Out of Browser的Debug和Notifications窗口
    Silverlight实例教程 Out of Browser与Office的互操作
  • 原文地址:https://www.cnblogs.com/pcyyyyy/p/9787074.html
Copyright © 2011-2022 走看看