在单峰数组中找到第k个元素

时间:2013-03-25 21:40:43

标签: algorithm big-o

给定n个不同元素的单峰数组A(意味着它的条目按其递增顺序直到其最大元素,之后其元素按降序排列),整数p(即增加的第一部分的长度) )和k(第k个最小元素)给出一个算法来计算在O(log n)时间内运行的第k个最小元素的值。

示例:

A= {1,23,50,30,20,2} 
p= 2
k=3

答案:20

修改

我试过了:

def ksmallest(arr1, arr2, k):
if len(arr1) == 0:
    return arr2[len(arr2)-k-1]
elif len(arr2) == 0:
    return arr1[k]
mida1 = (int)(len(arr1)/2)
mida2 = (int)((len(arr2)-1)/2)
if mida1+mida2<k:
    if arr1[mida1]>arr2[mida2]:
        return ksmallest(arr1, arr2[:mida2], k-(len(arr2)-mida2))
    else:
        return ksmallest(arr1[mida1+1:], arr2, k-mida1-1)
else:
    if arr1[mida1]>arr2[mida2]:
        return ksmallest(arr1[:mida1], arr2, k)
    else:
        return ksmallest(arr1, arr2[mida2+1:], k)

1 个答案:

答案 0 :(得分:0)

对于初学者来说,再看看你的索引。你从:

开始
if len(arr1) == 0:
    return arr2[len(arr2)-k-1]
elif len(arr2) == 0:
    return arr1[len(arr1)-k-1]

但是当然,如​​果arr1按升序排列,并且arr2按降序排列,则不会在同一位置找到第k个最小元素。