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


    开始时间: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,会出现以下情况:

     

     总结

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

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

    小组成员合照

  • 相关阅读:
    通过网络方式安装linux的五种方法
    谈FTP服务器攻击技术及其展望 (下)
    谈FTP服务器攻击技术及其展望 (修改中)
    Fedora 14 x64 试用手记
    加固Samba安全三法
    VMWare高可用集群在企业的应用
    Leetcode-1008 Construct Binary Search Tree from Preorder Traversal(先序遍历构造二叉树)
    Leetcode-1006 Clumsy Factorial(笨阶乘)
    Leetcode-1007 Minimum Domino Rotations For Equal Row(行相等的最少多米诺旋转)
    Leetcode-1005 Maximize Sum Of Array After K Negations(K 次取反后最大化的数组和)
  • 原文地址:https://www.cnblogs.com/pcyyyyy/p/9787074.html
Copyright © 2020-2023  润新知