前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >最大连续子序列和问题

最大连续子序列和问题

作者头像
zy010101
发布2019-05-25 19:58:28
2K0
发布2019-05-25 19:58:28
举报
文章被收录于专栏:程序员程序员

版权声明:本文为博主原创文章,转载请注明博客地址: https://cloud.tencent.com/developer/article/1433378

第一次看《数据结构与算法分析——C语言描述》这本书的时候,被书中一上来就给的最大子序列和问题给直接镇住了。直观感觉就是好难,好牛逼。

问题描述:给定整数k1,k2,k3,...,kn,求从第i个数到第j个数的最大值。(如果所有整数均为负数,那么最大子序列和规定为0)

根据题目描述,最直接的算法就是穷举所有的从i到j的和,比较它们的大小,留下最大的那个和,就是我们所求的最大子序列和。

算法1:暴力穷举法

代码语言:javascript
复制
int MaxSubsequenceSum(const vector<int>& num, int n)
{
	int thissum, i, j, k, maxsum;
	maxsum = 0;
	for ( i = 0; i < n; i++)
	{
		for ( j = i; j < n; j++)
		{
			thissum = 0;
			for ( k = i; k <= j; k++)        //穷举计算从i到j个数的和
			{
				thissum += num[k];
			}
			if (thissum > maxsum)
			{
				maxsum = thissum;
			}
		}
	}
	return maxsum;
}

它的时间复杂度是O(n³),这个时间复杂度很大。不是一个好的算法。

算法2:简化求和

代码语言:javascript
复制
int MaxSubsequenceSum(vector<int> &num, int n)
{
	int thissum, i, j, maxsum;
	maxsum = 0;
	for ( i = 0; i < n; i++)
	{
		thissum = 0;
		for ( j = i; j < n; j++)
		{    //对上面算法计算和的过程进行了简化
			thissum += num[j];
			if (thissum > maxsum)
			{
				maxsum = thissum;
			}
		}
	}
	return maxsum;
}

它相对于算法1就快了许多,它的时间复杂度是O(n²)。当然我们说一般而言这种时间复杂度也不是一个好的算法。

算法3:联机算法(online algorithm)

代码语言:javascript
复制
int MaxSubsequenceSum(const vector<int>& num, int n)
{
	int thissum, maxsum, i;
	maxsum = thissum = 0;
	for ( i = 0; i < n; i++)
	{
		thissum += num[i];
		if (thissum > maxsum)
		{
			maxsum = thissum;
		}
		if (thissum < 0)		//规定如果是负数,则最大值为0;
		{
			thissum = 0;
		}
	}
	return maxsum;
}

这个算法的时间复杂度是O(n),贼快。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年09月02日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档