最长上升子序列LIS

 
 
#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,还是得用动态规划。

猜你喜欢

转载自blog.csdn.net/weixin_40736096/article/details/79625131