最长递增子序列(Longest Increase Subsequence)

已知一个无序的数组{1,3,8,2,7,19,6,2,18,14,16},则这个数组的最长子序列为{1,2,7,9,14,19},这表明最长递增子序列是可以不连续的。


这道题是9月23号在腾讯笔试的时候看到的,是一道填空题,问的是最快的时间复杂度和最少的空间复杂度,当时想的是用动态规划来分析,因为对动态规划理解得的不够,所以根据对最长公共子序列的回忆,填了时间复杂度(n∧2)和空间复杂度(n∧2),显然,答案是错误的。虽然最长递增子序列和最长公共子序列有相同的地方,比如把无序的序列按升序排序后,然后和原序列一起求最长公共子序列,得到的就是最长递增子序列,但实际上最长递增子序列有更优的时间复杂度(nlog2n)。


利用动态规划分析,我们定义序列为a[1-n],c[1-n]为第i个数的最大递增子序列长度,c[1]-c[n]的值先初始化为1,对c[i]分析,我们发现,c[i]是一个问题的一个最优子结构,c[i]=max(c[j]+1), 1,例如a[8] ={1,2,3,6,7,5,8,4},则c[8] = {1,1+1=2,2+1=3,3+1=4,4+1=5,3+1=4,5+1=6,3+1=4}。

关于时间复杂度(nlog2n)是如何实现的可以看这里:http://www.programfan.com/blog/article.asp?id=13086

你可能感兴趣的:(Algorithms,and,Data,Structures)