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

题目要求:

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

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

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

 

设计思路:

解决主要的问题。因为题目要求数组中有正数也有负数,那么保证程序的时间复杂度为O(n)相对来讲还是较为容易的。问题是如何让用户随意输入一定范围内的整数数组,最后以回车或者某个结束符结束,然后程序可以读出用户输入的数组元素个数进行运算。我们用getchar()函数解决了这个问题,开始是用0结束数组的输入,后来发现这样有个bug就是如果用户中间输入0的话程序只运算0前面的部分,这是不行的。

 

程序代码:

#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() != '\n')
    {
        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;

}

 

 

结果截图:

 

 

 

 

 

 

 

总结:

我是和向瑜一起进行的结对开发的项目。总体来讲还算可以。在网上也借鉴了些思想,最后变成自己的,还算顺利吧。

 

 

posted @ 2020-02-27 19:01  _Aming  阅读(92)  评论(0编辑  收藏  举报