如何优化o(n ** 2)算法成为o(nlogn)或o(n)?

时间:2019-05-15 00:30:16

标签: python optimization

我正在尝试完成一个hackerrank问题,为您提供两个数组。一个是分数列表,另一个是来自特定人的分数列表。您必须确定每个分数的那个人的排名。 例如:

scores = [100,90,80]
alice = [80,90,100]

输出应为3,2,1,因为如果您将其与数组分数中的分数进行比较,这将是alice的放置方式。如果平局,则排名相同。

我尝试仅使用一个循环并使用range命令,但这完全失败了,并且我没有得到远程接近的答案。工作解决方案是o(n ** 2)解决方案,它通过了除大型测试以外的所有测试,但该测试超时了。

def climbingLeaderboard(scores, alice):
    scores = list(set(scores))
    new_list = []
    alcount = 1
    for i in alice:
        for x in scores:
            if i < x:
                alcount += 1
        new_list.append(alcount)
        alcount = 1
    return new_list

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:4)

将分数放入字典:

scores = {100:1, 90:2, 80:3}

现在,可以直接查找每个爱丽丝的乐谱以转换为所需的输出列表。

答案 1 :(得分:0)

您可以在列表理解范围内动态构建字典以在一行中实现这一目标:

result = [ d[s] for d in [{a:i+1 for i,a in enumerate(scores)}] for s in alice ]

这将为您提供O(N + M)时间的答案,其中N为len(分数),M为len(alice)