- UID
- 2
- 精华
- 积分
- 7736
- 威望
- 点
- 宅币
- 个
- 贡献
- 次
- 宅之契约
- 份
- 最后登录
- 1970-1-1
- 在线时间
- 小时
|
今天看到2个题,
①设计一个O(n²)时间的算法,找出n个数组成的序列的最长单调递增子序列
②将①题算法时间改为O(nlogn)
这种题无非就是用动态规划或者直接遍历做了,直接遍历的话自然用2重循环搞定,时间 O(n²)
用动态规划则是用数组记录以a为结尾元素的最长递增子序列的长度,但是做法及其笨拙,他是这样写的:
- int LISdyna()
- {
- int i,j,k;
- for(i=1;b[0]=1;i<n;i++)
- {
- for(j=0,k=0;j<i;j++)
- {
- if(a[j]<=a && k<b[j])
- k=b[j];
- }
- b=k+1;
- }
- return maxL(n);
- }
- int maxL(int n)
- {
- for(int i=0,temp=0;i<n;i++)
- {
- if(b>temp)
- temp=b;
- }
- return temp;
- }
复制代码
经我改进,复杂度为O(n):- void func2(int* arr,int len)
- {
- int* bn=new int[len];
- bn[0]=1;
- int i;
- for(i=1;i<len;i++)
- {
- if(arr>arr[i-1])
- bn=bn[i-1]+1;
- else
- bn=1;
- }
- int maxi=0;
- for(i=1;i<len;i++)
- {
- if(bn>bn[maxi])
- maxi=i;
- }
- cout<<endl<<"imin:"<<arr[maxi+1-bn[maxi]]<<" imax:"<<arr[maxi]<<endl;
- delete []bn;
- }
复制代码 |
|