2013-05-08 82 views

回答

2

它可以在线性时间内完成。首先让开始与二次:在具有索引i

  • 穿戴索引j第一位置

    1. 开始索引的位置i+1
    2. 只要未达到该阵列的端部和元件a[j]/2 <= a[i],增量j
    3. 记录索引i的“得分”。
    4. 递增索引i并返回步骤2.
    5. 当涵盖所有索引时,以最大分数获取索引。

    美中不足的是要认识到,如果你失败的步骤3一对(i, j),那么就意味着:

    for every i < k < j, a[k] <= a[i]/2 
    a[j] > a[i]/2 
    

    因此,在步骤5中,将任何k小于j将导致一个较小的分数,因为a[j] > a[i]/2 > a[k]/2。因此,开始的下一个索引是j

    现在我们在计算任何分数时最多访问一次索引。这将步骤从O(n^2)减少到O(n)。那么获得最高分的指数显然是O(n)

  • +0

    在步骤3,你的意思是[j]/2 <= a [i]? – user2361502 2013-05-08 17:57:27

    +0

    是的,这是一个错字。编辑... – UmNyobe 2013-05-09 17:32:01