动态规划------最长递增子序列
时间复杂度: O(NlogN)
class AscentSequence { public: int findLongest(vector<int> A, int n) { //B数组,是存储对应长度i的LIS的最小末尾 vector<int> B; B.push_back(A[0]); for(int i=1;i<n;i++){ if(A[i]>B.back()){ B.push_back(A[i]); continue; } else B[findPos( B , A[i])]= A[i]; } return B.size(); } //找到B中第一个比A[i]大的数的位置,二分法 O(logN) private: int findPos(vector<int> B ,int num) { int left=0,right=B.size(); while(left<right){ int mid=left+(right-left)/2; if(B[mid]>num) right=mid;//!!!!!!!!! else if(B[mid]<num) left=mid+1; else return mid; } return left; } };
时间复杂度 O(N^2)
class AscentSequence { public: int findLongest(vector<int> A, int n) { // write code here vector<int> tmp(n,1); for(int i=0;i<n;++i){ for(int j=0;j<=i;++j){ if(A[i]>A[j] && tmp[i]<tmp[j]+1) tmp[i]=tmp[j]+1; } } int tmax=tmp[0]; for(int i=0;i<n;i++){ tmax=max(tmp[i],tmax); } return tmax; };