#include<bits/stdc++.h>
using namespace std;
int a[100];
int b[100];//b中存储的不是最长上升子序列
int len = 1;//字符串长度为1时 最长上升子序列长度为1
//二分查找
int bs(int x){
int l = 1,r = len;
int mid;
//返回第一个大于或等于x的元素的下标
while(l <= r){
mid = l+(r-l)/2;
if(x > b[mid]) l = mid + 1;
else r = mid - 1;
}
return l;
}
int main(){
int n,j;
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
b[1] = a[1];
for(int i=2;i<=n;i++){
if(a[i] > b[len])
b[++len] = a[i];
else{
//不断更新得到可以得到的最大的len长度
j = bs(a[i]);
b[j] = a[i];
}
}
printf("%d",len);
return 0;
}
最长上升子序列长度(C++二分查找)
于 2022-02-01 09:08:59 首次发布