#define MAX 1000000
int find(int a[],int x,int l,int r){
while (l<=r){
int mid=(l+r)/2;
if (a[mid]==x)
return mid;
if (a[mid]<x)
l=mid+1;
else
r=mid-1;
}
return l;
}
int lis(int a[],int n){
int min[MAX];
int len=-1;
for (int i=0;i<n;i++){
int idx=find(min,a[i],0,len);
if (idx>len)
min[++len]=a[i];
else
min[idx]=min[idx]>a[i]?a[i]:min[idx];
}
return len+1;
}
最长递增子序列(nlogn)
本文介绍了一种求解最长递增子序列(LIS)问题的高效算法。通过使用二分查找方法,该算法能够在O(n log n)的时间复杂度内找到给定数组中最长递增子序列的长度。代码中定义了两个主要函数:find()用于二分查找,而lis()则实现了整个算法流程。

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



