【转】两个算法题,感觉挺有意思

源地址

第19题


分析:

【1】

a[i]在排序后的位置是[i-k, i+k],a[i+2k]在排序后的位置是[i+k, i+3k],必然有a[i] <= a[i+2k]

所以数组a里实际上有2k个各自有序的、交错的子序列,如a1={a[0], a[2k], a[4k]...},a2={a[1], a[2k+1], a[4k+1], ...} 

所以可以用2k-路归并排序,用一个大小为2k的小顶堆辅助归并,时间复杂度是O(n*log2k),小于O(nk)。

【2】

申请的辅助栈空间只需要k个空间简历最小堆就行了,前面的0-k-1里面的至少会淘汰了1个。加入一个,2-k里面按照性质也一定会淘汰一个。


第20题:字符串数组seq[] = a,b,c,d,aa,ba,ca,da,ab,bb,cb,db,ac...,aaa,baa,...

(1)aaa是第几个字符串

(2)ababacd是第几个

(3)第1000个字符串是什么

(4)编写函数find(),返回字符串在seq中是第几个(语言不限)


分析:

我的方法是 a b c d 代表权重 1 2 3 4 
aaa 就是 1*4^0 + 1*4^1 + 1*4^2 = 21

转载于:https://www.cnblogs.com/pmars/archive/2012/10/11/2719668.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值