运行时间太长

时间:2020-01-02 15:23:10

标签: python

当我使用代码对其进行测试时,没有错误,但是由于超时而失败。

问题

故障率定义如下。 玩家数/就舞台而言的玩家数 阶段总数N,用户当前可以停止游戏。

限制

级数N是1以上且500以下的自然数。 阶段的长度为1以上且200,000以下。 包含步骤1上方和N + 1以下的天然水。 用户当前正在挑战每个自然数。 N +1是最后阶段。 失败率仍然很高。 该阶段的成功率为零。

我的代码

def solution(N, stages):
    fail = []
    for i in range(1,N+1):
        no_clear = stages.count(i)
        he_stage = sum([stages.count(x) for x in range(i,N+2)])
        if no_clear==0: 
            fail.append((i,0))
        else: 
            fail.append((i,no_clear/he_stage))
    fail=sorted(fail,key=lambda x: (-x[1],x[0]))
    print(fail)
    return [fail[i][0] for i in range(N)]

1 个答案:

答案 0 :(得分:2)

我认为stageslist。在count上反复调用list具有很高的复杂性,特别是如果您是循环执行的话。

您可以使用缓存或更简单的方法:将stages.count(x)替换为collections.Counter对象调用

之前:

def solution(N, stages):
    fail = []
    for i in range(1,N+1):
        no_clear = stages.count(i)
        he_stage = sum([stages.count(x) for x in range(i,N+2)])

之后:

import collections
def solution(N, stages):
   fail = []
   stages_counter = collections.Counter(stages)
   for i in range(1,N+1):
       no_clear = stages_counter[i]
       he_stage = sum(stages_counter[x] for x in range(i,N+2))

这将大大降低您的复杂性。元素一劳永逸。完成后,只需O(1)时间访问字典即可。