- UID
- 2
- 精华
- 76
- 积分
- 7375
- 威望
- 291 点
- 宅币
- 5621 个
- 贡献
- 253 次
- 宅之契约
- 0 份
- 最后登录
- 2024-5-15
- 在线时间
- 954 小时
- QQ
用户组: 真·技术宅
- UID
- 2
- 精华
- 76
- 威望
- 291 点
- 宅币
- 5621 个
- 贡献
- 253 次
- 宅之契约
- 0 份
- 在线时间
- 954 小时
- 注册时间
- 2014-1-25
|
今天看到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;
- }
复制代码 |
|