连续子数组的最大和--剑指Offer

1、题目:

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

如数组为{1,-2,3,10,-4,7,2,-5}和最大子数组为{3,10,-4,7,2},因此输出为该子数组的和为18.


2、思路一:直接分析

我们可以通过从头到尾逐个累加数组中的每个数字,当累加到某一个数字后,如果累加后和的值比最后一次累加的数字还要小的话,就抛弃前面累加和的值(即不用考虑前面的子数组),并从最后一次累加的值开始往下累加。

参考程序代码:

bool Invalid = false;//因为可能子数组的最大值为0,所以需要全局变量来标记输入是否无效
int FindMaxArraySum(int* pData, int length){
	if((pData == NULL )||(length <= 0))
	{
		Invalid = true;  //表示输入无效,返回值为0
		return 0;
	}
	Invalid = false;
	int CurrSum = 0;
	int MaxSum =0x80000000;
	for(int i =0;i<length;i++)
	{
		if(CurrSum <= 0)//如果下一次累加后的值小于0,则抛弃前面的累加结果,从新开始累加
			CurrSum = pData[i];
		else
			CurrSum += pData[i];
		if(CurrSum > MaxSum)
			MaxSum = CurrSum;
	}
	return MaxSum;
}
3、思路二、动态规划思想
其思路与上述异曲同工之效,就是显得高大上了一点,这里就不再累赘。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值