左老师-最长递增子序列

来源:互联网 发布:淘宝虚拟店铺货源 编辑:程序博客网 时间:2024/06/11 12:06

#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


0 0
原创粉丝点击