面试题整理9 连续子数组的最大和

探讨《剑指Offer》面试题31,求解整型数组中所有子数组的最大和,采用O(n)时间复杂度算法实现,并提供代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

《剑指offer》面试题31:

题目: 输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成的一个子数组,求所有子数组的和的最大值,要求时间复杂度为O(n)。

分析:一个变量保存目前的子数组的和,一个变量保存目前最大的子数组的和。当遍历到某一个值时,如果第一个变量值变为负数,则将其舍掉,继续往下遍历;如果当前子数组的和大于保存的最大子数组的和,将当前子数组的和赋值给第二个变量。这样复杂度为O(n)。


代码:

注释掉的为《剑指offer》中的代码,其中最大子数组的和初始化为0x8000 0000,int型的最小范围是-2^31~2^31,0x8000 0000是int型表示最小范围时的负数最小值,感觉这样初始化不好,未注释的是自己写的代码。

bool g_InvalidInput = false;

int FindGreatestSumOfSubArray(int *pData, int nLength)
{
    if((pData == NULL) || (nLength <= 0))
    {
        g_InvalidInput = true;
        return 0;
    }

    g_InvalidInput = false;

    /*int nCurSum = 0;
    int nGreatestSum = 0x80000000;
    for(int i = 0; i < nLength; ++i)
    {
        if(nCurSum <= 0)
            nCurSum = pData[i];
        else
            nCurSum += pData[i];

        if(nCurSum > nGreatestSum)
            nGreatestSum = nCurSum;
    }*/

	//修改
	int nCurSum = pData[0];
	int nGreatestSum = pData[0];
	for( int i = 1; i < nLength; ++i )
	{
		nCurSum += pData[i];
		if( nCurSum < 0 )
		{
			nCurSum = 0;
		}else if(nCurSum > nGreatestSum)
		{
			nGreatestSum = nCurSum;
		}
	}
    return nGreatestSum;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值