面试题31:连续子数组的最大和

/*题目:输入一个整型数组,数组里有正数也有负数,数组中一个或连续的多个整数组成一个子数组。求所有子数组的和
的最大值。要求时间复杂度为O(n)。*/
#include <iostream>
using namespace std;
bool g_InvalidInput = false;
int FindGreatestSumofSubarrary(int a[], int n)
{
    //处理无效输入
    if(a == NULL || n <= 0)
    {
        g_InvalidInput = true;
        return 0;
    }
    int CurrentSum = 0;
    int MaxSum = 0x80000000;//-2147483648
    int start = 0;
    int end = 0;
    //遍历数组
    for(int i = 0; i < n; ++i)
    {
        if(CurrentSum <= 0)
        {
            CurrentSum = a[i];
            start = i;
        }else
        {
            CurrentSum += a[i];
        }
        if(CurrentSum > MaxSum)
        {
            MaxSum = CurrentSum;
            end = i;
        }
    }
    if(start <= end)
    {
        for(int k = start; k <= end; ++k)
        cout << a[k] << " ";
    }else
    {
        cout << a[end];
    }
    cout << endl;
    cout << MaxSum << endl;
    return MaxSum;
}
//=================测试代码================
void Test(char *TestName, int a[], int n, int expectedresult, bool expectedflag)
{
    if(TestName != NULL)
    cout << TestName << " begins: " << endl;
    int result = FindGreatestSumofSubarrary(a, n);
    if(result == expectedresult && g_InvalidInput == expectedflag)
    cout << "Passed!" << endl;
    else
    cout << "Failed!" << endl;
}
//===============测试用例=================
void Test1()
{
    int data[] = {1, -2, 3, 10, -4, 7, 2, -5};
    Test("Test1", data, sizeof(data) / sizeof(int), 18, false);
}
//全是负数
void Test2()
{
    int data[] = {-2, -8, -1, -5, -9};
    Test("Test2", data, sizeof(data) / sizeof(int), -1, false);
}
//全是正数
void Test3()
{
    int data[] = {2, 8, 1, 5, 9};
    Test("Test3", data, sizeof(data) / sizeof(int), 25, false);
}
//无效输入
void Test4()
{
    Test("Test4", NULL, 0, 0, true);
}
int main()
{
    Test1();
    Test2();
    Test3();
    Test4();
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值