某公司面试题:连续子数组的最大和

介绍了一种求解最大子数组和的问题,通过遍历数组并使用动态规划思想,实现时间复杂度为O(n)的高效算法。

题目:

输入一个整型数组,元素有整有负,如{1,-2,3,10,-4,7,2,-5}。求连续子数组和的最大值,时间复杂度O(n)。


题解:

遍历数组元素并求和,用变量maximum记录出现过的和的最大值,用curMaximum记录当前和的最大值,当curMaximum小于0时,curMaximum+下一个元素 < 下一个元素,可直接将curMaximum设为下一个元素值,若curMaximum > maximum,修改maximum为curMaximum。

class Solution {
public:
	Solution():isValidInput(true){}

	int FindGreatestSum( int* inputArray, int length )
	{
		if(!inputArray)
		{
			isValidInput = false;
			return 0;
		}

		int maximum = 0x80000000;
		int curMaximum = 0;
		for(int i = 0; i < length; i++)
		{
			if(curMaximum < 0)
				curMaximum = inputArray[i];
			else
				curMaximum += inputArray[i];
			if(curMaximum > maximum)
				maximum = curMaximum;
		}
		return maximum;
	}

	bool isValidInput;
};

动态规划思想:

curMax[i] = Data[i]                          if curMax[i-1] < 0 or i = 0;

curMax[i] = Data[i] + curMax[i-1]  if i > 0 && curMax[i-1] >= 0

最后找最大的curMax[i],或者在计算过程中用变量保存全局maximum。 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值