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

题目:返回整数数组最大子数组之和

要求:输入一个整形数组,数组里有正数也有负数

     数组里连续的一个或多个整数组组成一个子数组,每个子数组都有一个和

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

   

设计思想:从第二个数开始,如果这个数加上前一个数大于这个数的值,令这个数的值等于这个数加上前一个数。从得到数组的第一个数开始比较,输出值最大的数

出现的问题:无

源代码

#include<iostream>
using namespace std;
int main()
{
    int a[100],n;
    cin >> n;
    for(int i = 0; i < n; i++)
        cin >> a[i];
    for (int i = 1; i < n; i++)
    {
        if (a[i] + a[i - 1] > a[i])
            a[i] = a[i] + a[i - 1];
    }
    int ans = -100000;
    for (int i = 0; i < n; i++)
    {
        if (a[i] > ans)
            ans = a[i];
    }
    cout << ans << endl;
    system("pause");
    return 0;
}

结果截图

 

 

环形数组

设计思想:将a[0]~a[n-1]赋给a[n]到a[2n-1],和普通数组一样从第二个数开始比较并保证比较次数小于输入数组的个数,输出最大值。

出现的问题:一个数被取值两次,通过控制比较次数小于数组个数得到解决

源代码:

#include<iostream>
using namespace std;
int main()
{
    int a[100],n,sum=0,j=0;
    cin >> n;
    for(int i = 0; i < n; i++)
        cin >> a[i];
    for (int i = 0; i < n; i++)
    {
        a[n + i] = a[i];
    }
    for (int i = 1; i < 2 * n; i++)
    {
        if ((a[i] + a[i - 1] > a[i])&&j<n)
        {
            a[i] = a[i - 1] + a[i];
            j++;
        }
    }
    int m=a[0];
    for (int i = 0; i < 2 * n; i++)
    {
        if (a[i] > m)
            m = a[i];
    }
    cout << m << endl;
    system("pause");
    return 0;
}

测试结果:

 

原文地址:https://www.cnblogs.com/songxinai/p/12373481.html