最长递归子序列
设L=<a1,a2,…,an>是n个不同的实数的序列,L的递增子序列是这样一个子序列Lin=<aK1,ak2,…,akm>,其中k1<k2<…<km且aK1<ak2<…<akm。求最大的m值。
1.时间复杂度为O(n2),空间复杂度O(n)的算法
//O(n2)
int LIS1(const int arr[], const int size)
{
vector<int> h;
h.push_back(1);
int index = 1;
int max = 1;
while (index < size)
{
int longest_sub_size = 0;
for (int j = 0; j < index; ++j)
{
if (arr[j] < arr[index] && longest_sub_size < h[j])
{
longest_sub_size = h[j];
if (max < longest_sub_size+1)
{
max = longest_sub_size + 1;
}
}
}
h.push_back(longest_sub_size + 1);
++index;
}
return max;
}
2.时间复杂度O(n*log n),空间复杂度O(n)的算法
int BinSearch(int key, int* d, int low, int high)
{
while(low<=high)
{
int mid = (low+high)>>1;
if(key>d[mid] && key<=d[mid+1])
return mid;
else if(key>d[mid])
low = mid+1;
else
high = mid-1;
}
return 0;
}
int LIS(int* a, int n, int* d)
{
int i,j;
d[1] = a[1];
int len = 1; //递增子序列长度
for(i = 2; i <= n; i++)
{
if(d[len]<a[i])
j = ++len;
else
j = BinSearch(a[i],d,1,len) + 1;
d[j] = a[i];
}
return len;
}
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。