#include<iostream>
#include<string>
#include <vector>
using namespace std;
//最长递增子序列长度
int maxlen(int *arr,int len)
{
int b[100]={0};//当必须以arr[i]为结尾的前提下,最长递增长度为h[i]
int max=1;
for(int i=0;i<8;i++)
{
b[i]=1;
for(int j=i-1;j>=0;j--)
{
if(arr[i]>arr[j])
{
if(max<(b[i]+b[j]))
max=b[i]+b[j];
}
}
if(b[i]!=max)
b[i]=max;
max=0;
}
max=b[0];
for(int i=1;i<8;i++)
{
if(b[i]>max)
max=b[i];
}
return max;
}
int maxlen2(int *arr,int len)<span style="font-family: Arial, Helvetica, sans-serif;">//这个方法是nlog(n)在查找的时候是二分查找,h[i]有效区表示遍历到当前时刻为止长度为i+1的最小末尾是多少</span>
{
int cur=arr[0];
vector<int>h(len,0);
int max=0;
int right=0;
for(int i=0;i<len;i++)
{
int l=0;
int r=right;
while(l<=r)
{
int m=(l+r)/2;
if(arr[i]>h[m])
l=m+1;
else
r=m-1;
}
int j=l>r?l:r;
h[j]=arr[i];
right=right>j?right:j;
}
return right;
}
int main()
{
int len;
int arr[8];
cin>>len;
for(int i=0;i<8;i++)
{
cin>>arr[i];
}
cout<<maxlen2(arr,len)<<endl;
return 0;
}
第一种方法时间复杂度O(N2)
</pre><pre>
第二种方法时间复杂度O(NlogN)
h[ ]变化过程2 1 6 4 5 2 7 4
2
1
1 6
1 4
1 4 5
1 2 5
1 2 5 7
1 2 4 7