求子数组的最大元数之和O(n)

直接上例子

这是一个非常简单的数组,那么我们应该如何找到子数组的最大元素之和?

首先需要理解,得到这个最大的数,必定是多个正整数相加

比如4和5相加一定会大于4、5、(2+(-3)),显然在这里-3和2可以合并看为一个元素

因此可以得到一个结论

如果某几个元素相加(sum)之和小于等于0,那么这个子数组一定不包含它们

下面用画图的方式来演示

显然这个时候sum是正整数,可以不用被抛弃

于是用ans来记录目前sum的值(假设目前这个sum就是最大的)

逻辑继续向下运行

此时发现,sum不符合我们存进ans的条件了

故这次ans不发生更新,而是保留原来的值

这个时候下标i来到第四个元素,奇妙的事情发生了

sum这个时候为负数,显然我们不能再拿他与a[i]进行相加了

而是直接把原来的sum舍弃掉,并把a[i]的值赋给sum

*注:这里并不用担心之前的数据丢失了,因为之前的最大值已经存在了ans中

操作完以后又发现sum大于ans了!于是再次更新ans

如此循环,只需要循环n-1次,一定能找到最大的子数组

请看具体的实现代码

int search(int* a,int n)
{
	int sum;
	int ans = -10000000;
	sum = a[0];
	for (int i = 1; i < n; i++)
	{
		if (sum < 0)
			sum = p[i];
		else
			sum += a[i];
		ans = max(ans, sum);
	}
	return ans;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值