问题描述
输入一串数字,或数组,如-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;
}