用O(nlog(n)实现最长递增子序列问题

问题描述

 输入一串数字,或数组,如-5, 1, -3, -1, -2, 1, 4, 8, 9, 7,则该数组的最长递增子序列之一(注意,最长递增子序列有时候不止一个)为-5,-3,  -1, 1, 4, 8, 9

解决方案:

  有两种思路:1. 用动态规划来解决(O(n^2)));2,用类似二分排序的方法来解决(O(nlog(n)))

思路一:

思路二:

具体思路参考http://www.felix021.com/blog/read.php?entryid=1587&page=2&part=1,但他的代码有点问题,自己改了下
int dp_nlogn(int *data, int *auxData, int len)
{
	int seqLen = 1;
	int i, mid = 0, left = 1, right = 0;
	auxData[1] = data[1];
	for(i=2; i<=len; i++)
	{
		left = 1; 
		right = seqLen;
		while(left<=right)		//find a pos to insert
		{
			mid = (left + right)/2;
			if(auxData[mid]<data[i])
				left = mid + 1;
			else
				right = mid - 1;
		}
		if(left >= seqLen)  //curLen is logger than before
			auxData[left] = data[i]; //insert
		if(left>seqLen)	 
		{
			seqLen++;
		}
	}
	return seqLen;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值