第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