• 数组练习1


    结对开发实验成员:张晓菲  张哲

    一、本次实验要求:

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

    二、设计思想:

        开始时我们的思路便是最笨的,即利用for循环将所有子数组的和求出来,然后找出其最大子数组和输出,但是这样明显不符合O(n)的时间复杂度要求,在课堂听过他人的思路再回来整理后,有了自己的新的思路。

       其实求其最大子数组和也是有一定的规律的,一个子数组求和的过程中当其加上某一个数成负数后则表示其再加下去就没有必要了,反之则继续加下去,每次相加后都要做比比较保留其较大的值,直至循环结束,求出子数组和的最大值。

    三、程序代码

     1 //返回一个整数数组中最大子数组的和
     2 //有正数、有负数、数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和、时间复杂度O(n)
     3 //张哲、张晓菲 2016/3/22
     4 
     5 #include<iostream>
     6 using namespace std;
     7 
     8 int main()
     9 {
    10     int num,*arr;
    11     int sum=0;
    12     cout<<"请输入数组元素个数:";
    13     cin>>num;
    14     arr=new int[num];
    15     if(arr==NULL)
    16     {
    17         cout<<"申请空间失败!"<<endl;
    18         return 1;
    19     }
    20     cout<<"请输入数组元素的值:";
    21     for(int i=0;i<num;i++)
    22         cin>>arr[i];
    23     int max=arr[0];
    24     for(int j=0;j<num;j++)
    25     {
    26         if(sum<=0)
    27             sum=arr[j];
    28         else
    29             sum=sum+arr[j];
    30         if(sum>max)
    31             max=sum;
    32     }
    33     cout<<"子数组和的最大值为:"<<max<<endl;
    34     delete [] arr;
    35     return 0;
    36 }

    四、实验截图

    五、总结

       本次实验其实重在对问题的一个分析与思考,可能一开始大家都会想到一个最简单的方法,即求出所有子数组的和,取其最大,但对于编程来说,这个程序思路其实不是罪简单的,通过对问题的一个全面思考,将其程序简化,相当于用编程的思想去解决遇到的问题,这是本次实验我体会最深的地方。

  • 相关阅读:
    扩展域并查集经典题
    2010提高组-C]关押罪犯(扩展域并查集
    [2015普及组-D]推销员 思维que
    The 2019 Asia Nanchang First Round Online Programming Contest C(cf原题,线段树维护矩阵)
    Fire-Fighting Hero(多源最短路和单源最短路)
    The Preliminary Contest for ICPC Asia Xuzhou 2019
    Cow Routing(最短路spfa)
    hdu6582
    ACM_题目这么难,来局愉快的昆特牌吧
    ACM_水题你信吗
  • 原文地址:https://www.cnblogs.com/zz0906/p/5316274.html
Copyright © 2020-2023  润新知