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