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

源地址

第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/p/2719668.html