您的位置:首页 > 其它

最长上升子序列LIS

2018-03-20 14:29 323 查看
#include<vector>
#include<iostream>
using namespace std;
vector<int>rebuild(vector<int>old,int key)
{
int begin = 0;
int end = old.size() - 1;
int mid = begin + (end - begin) / 2;
if (key > old[end])
{
old.push_back(key);
}
else
{
while (begin != end)
{
if (old[mid] >= key)
{
end = mid;
mid = begin + (end - begin) / 2;
}
else
{
begin = mid + 1;
mid = begin + (end - begin) / 2;
}
}
if (old[begin] >= key)old[begin] = key;
}
return old;
}
vector<int> LIS(vector<int>arr)
{
vector<int>newarr;
if (arr.empty())return newarr;
int length = arr.size();
newarr.push_back(arr[0]);
for (int i = 1; i < length; i++)
{
newarr = rebuild(newarr,arr[i]);
}
return newarr;
}
int main()
{
vector<int>a = { 2,15,6,18,351,151,15,7 };
vector<int>b=LIS(a);
int len = b.size();
cout << len;
return 0;
}
偶然看到一个题目利用了这个LIS算法,仔细琢磨了一个多小时,自己写出了最小上升子序列的算法,利用二分查找替换元素,时间复杂度为O(nlogn),但是这个算法得到的只能是LIS的个数,如果要输出LIS,还是得用动态规划。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: