• 返回整数数组最大子数组和


                                         

                  返回整数数组最大子数组和

    这次题目的要求还是结对开发,题目:返回一个整数数组中最大子数组的和

    要求如下:

    1、输入一个整型数组,数组里有正数也有负数;

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

    3、求所有子数组的和的最大值,要求时间复杂度为O(n);

    设计思路:

         本次实验面对的两个问题是:

         一是如何让用户随意输入一定范围内的整数数组,最后以回车或者某个结束符结束,然后程序可以读出用户输入的数组元素个数进行运算。我们用getchar()函数解决了这个问题,开始是用0结束数组的输入,后来发现这样有个bug就是如果用户中间输入0的话程序只运算0前面的部分,这是不行的。

          那么另一个问题也是最重要的问题就是如何避免使用“最笨的“方法,使程序的时间复杂度为O(n)。最后我们这么决定,首先,当某一段子数组的和为负数时,就没有继续加下去的必要,将出现负数和之前的那个最大和用b表示出来,而新的子数组从出现负数和最后一位的下一位开始;然后再单独考虑所有的数都是负数的情况,即为数组中最大负数值(后来发现这个问题不用考虑,题目要求数组中有正数也有负数……)

    程序代码:

    //返回一个整数数组中最大子数组的和
    //孔宇航,赵子茵 2016/3/21
    
    #include<iostream>
    using namespace std;
    
    int main()
    {
        int arr[1000];
        int i, MaxSum = 0, max, sum = 0, num = 1, count = 0;
        /*MaxSum是子数组最大和
          max是整数组的最大值
          sum是子数组的和
          num是元素个数
          count是元素中负数的个数*/
        cout << "请输入一个整数数组(不超过1000个):" << endl;
        cin >> arr[0];
        while (getchar() != '
    ')
        {
            cin >> arr[num];
            num++;
        }
    
        for (i = 0; i < num; i++)
        {
            if (sum < 0)
                sum = arr[i];//当子数组和小于0时,与无论与后面数组如何相加,和肯定小于后一段数组之和,此时,将b重新赋值,置为下一个元素
            else
                sum += arr[i];
            if (MaxSum < sum)
                MaxSum = sum;
        }
    
        max = arr[0];//d记录数组中的最大元素值
        for (i = 0; i<num; i++)  //如果数组全为负数,最大子数组和就是数组中最大值
        {
            if (arr[i]<0)
                count++;
            if (arr[i]>max)
                max = arr[i];
            if (count == num)
                MaxSum = max;
    
        }
        cout << "子数组的最大和为:" << MaxSum << endl;
        return 0;
    
    }

    实验截图:

    实验总结:

        本次实验依旧是结对开发,对于合作默契度肯定要比上次要好,这次程序比较简单编程没用多少时间就完成了,在网上也借鉴了些思想,最后变成自己的,总的来说还算顺利,对于这个经典的问题,网上各种的思想让我感到震撼,不想我拿到题目首先就是最笨的思想,一组一组的把所有的算出来再比较,看来编程思想还是需要培养地。

        最后附上小伙伴的链接:http://www.cnblogs.com/2016helen/

  • 相关阅读:
    gridview 后台增加列
    SQL Server 触发器
    PIVOT 和 UNPIVOT 命令的SQL Server版本
    HtmlHelper.Raw,<%%>,<%:%>,<%=%>的区别及使用
    分布式搜索的面试题3
    分布式搜索的面试题2
    分布式搜索的面试题1
    消息队列的面试题7
    消息队列的面试题6
    消息队列的面试题5
  • 原文地址:https://www.cnblogs.com/kongyuhang/p/5320022.html
Copyright © 2020-2023  润新知