面试题(十一)最长递增子序列



给定一个长度为N的数组,找出一个最长的单调自增子序列(不一定连续,但是顺序不能乱)。例如:给定一个长度为6的数组A{5, 6, 7, 1, 2, 8},则其最长的单调递增子序列为{5,6,7,8},长度为4

这个算法采用DP策略,核心是维护一个END数组,其中END[i]代表以pArray[i]作为子数组的最后一个数时,这个子数组的最大长度,那么END[i+1]要么等于END[ j ]+1,要么等于1,0=<j<=i-1, 当END[i]等于1时候,说明pArray[i]比前面的

pArray[0]到pArray[i-1]都小,与前面的子序列不能构成递增序列。当END[i+1]等于END[ j ]+1的时候,说明pArray[i]>pArray[j], 从而与之构成递增子序列,所对应的最长子序列长度也就是END[ j ]+1;

代码如下:

int LIS(int *pArray,int nSize)
{
	if (pArray==NULL)
	{
		return -1;
	}
	int *pLIS=new int[nSize];
	
	pLIS[0]=1;
	for (int i=1;i<nSize;i++)
	{	pLIS[i]=1;
		for (int j=0;j<i;j++)
		{	
			if (pArray[i]>pArray[j]&&pLIS[j]+1>pLIS[i])
				//这个判断决定pLIS[i]会取最大的那个
			{
				pLIS[i]=pLIS[j]+1;
			}
		}
	}
	delete []pLIS;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值