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


    源地址

    第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

  • 相关阅读:
    HDU 1429
    HDU 1622
    HDU 3335
    HDU 4160
    HDU 1350
    HDU 5086
    HDU 1300
    HDU 3047
    HDU 3038
    HDU 5100
  • 原文地址:https://www.cnblogs.com/pmars/p/2719668.html
Copyright © 2020-2023  润新知