
int LIS(int a[], int n)
{
int len[MAXSIZE];
int i, j;
int maxlen = 0;
//计算以第i个数为结尾的最长上升子序列的长度
for (i = 1; i <= n; i++)
{
len[i] = 0;
//从前i-1个数中找出满足a[j]<a[i](1<=j<i)条件的最大的L[j]
for (j = i-1; j >= 1; j--)
{
if (a[j] < a[i] && len[j] > len[i])
{
len[i] = len[j];
}
}
len[i]++;
if (len[i] > maxlen)
{
maxlen = len[i];
}
}
return maxlen;
}int BSearch(int a[], int n, int t)
{
int low = 1;
int high = n;
while (low <= high)
{
int mid = (low + high) / 2;
if (t == a[mid])
{
return mid;
}
else if (t > a[mid])
{
low = mid + 1;
}
else
{
high = mid - 1;
}
}
return low;
}
int LIS_BSearch(int a[], int m[], int n)
{
int maxlen = 1; //最长上升子序列的长度
m[maxlen] = a[1];
int i;
for (i = 2; i <= n; i++)
{
if (a[i] > m[maxlen])
{
m[++maxlen] = a[i];
}
else
{
//返回小于a[i]的最大值的位置p
int p = BSearch(m, maxlen, a[i]);
m[p] = a[i];
}
}
return maxlen;
}改进后的算法时间复杂度为O(nlogn)。
3658



被折叠的 条评论
为什么被折叠?



