时间复杂度: 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;
};