Python “如何优化我的代码以解决黑客问题”;登上排行榜;?

Python “如何优化我的代码以解决黑客问题”;登上排行榜;?,python,Python,问题的链接: 对于我的解决方案,它通过了两个“运行代码”测试用例,但在提交时,它只通过了12个测试用例中的8个,但由于超时而失败了4个。我猜解决方案本身是正确的。关于如何优化解决方案,您有什么想法吗 一些小测试用例: # Small Test case 1 ranked = [100, 90, 90, 80] ## already in descending order player = [70, 80, 105] ## expected ans = [4, 3, 1] # Small Tes

问题的链接:

对于我的解决方案,它通过了两个“运行代码”测试用例,但在提交时,它只通过了12个测试用例中的8个,但由于超时而失败了4个。我猜解决方案本身是正确的。关于如何优化解决方案,您有什么想法吗

一些小测试用例:

# Small Test case 1
ranked = [100, 90, 90, 80] ## already in descending order
player = [70, 80, 105]
## expected ans = [4, 3, 1]

# Small Test case 2
ranked = [100, 90, 90, 80] ## already in descending order
player = [70, 90, 105]
## expected ans = [4, 2, 1]

# Small Test case 3
ranked = [100, 100, 50, 40, 40, 20, 10] ## already in descending order
player = [5, 25, 50, 120]
## expected ans = [6, 4, 2, 1]
我的解决方案:

def climbingLeaderboard(_r, _p):
    #print(f"Params passed:\nranked={_r}\nplayer={_p}")
    ans = list()
    for pidx, pscore in enumerate(_p):
        #print(f"\nPos {pidx} : Player score = {pscore}")
        crank = 1 ## set current rank as 1 at start of evaluation of a player score
        if pscore >= _r[0]:
            ans.append(1)
            continue
        for ridx, rscore in enumerate(_r[1:]):
            #print(f"ridx={ridx} , RankedScore={rscore} , PlayerScore = {pscore} , crank={crank}")
            if rscore < _r[ridx]: ## current ranked score < previous ranked score
                crank += 1
            if pscore >= rscore:
                ans.append(crank)
                break
        else:
            ans.append(crank+1)
        #print(f"now ans={ans}")
    return ans

print(f"\n\nFinal answer = {f1(ranked, player)}")
def攀登排行榜(\u r,\u p):
#打印(f“传递的参数:\n等级={u r}\n图层={u p}”)
ans=列表()
对于pidx,枚举中的pscore(\u p):
#打印(f“\nPos{pidx}:玩家分数={pscore}”)
crank=1##在开始评估球员得分时,将当前排名设置为1
如果pscore>=\u r[0]:
附件(1)
持续
对于ridx,枚举中的rscore(_r[1:]):
#打印(f“ridx={ridx},RankedScore={rscore},PlayerScore={pscore},crank={crank}”)
如果rscore<_r[ridx]:##当前排名分数<先前排名分数
曲柄+=1
如果pscore>=rscore:
ans.append(曲柄)
打破
其他:
ans.append(曲柄+1)
#打印(f“now ans={ans}”)
返回ans
打印(f“\n\n最终答案={f1(排名,玩家)}”)

最明显的时间损失是使用线性搜索,即O(n)搜索
n
现有玩家。下一个问题是,在两次搜索之间,你会丢掉所有的学习,因此你必须对你的
m
分数进行
m
独立搜索

将线性搜索替换为
\u r
(长度
n
)上的二进制搜索。这将使您的速度足够快,有可能通过计时测试。但是,为了提高效率,请记住上一个分数是在哪里找到的,这样您就不会搜索
\u r
中您知道不能包含下一个分数的区域。例如,如果您发现第一个分数符合
\u r[idx1]
,那么您的下一个二进制搜索应该只包括
\u r[:indx1]
(玩家分数按升序排列,因此您不必在排行榜上搜索任何较低的位置)

你能从那里拿走吗



为了提高速度,您可以对排行榜上的分数分布进行一些假设。在现实世界中,这是合理的,尤其是对于一个非常大的排行榜。如果您使用直接的插值搜索,您将在预期情况下节省更多的时间。

假设他们给您提供了一个大列表,在每个循环中创建
\r[1://code>将需要时间。您可以通过创建一次子列表并重用它来节省时间,但实际上您甚至不需要这样做。您可以从
(1,len(_r))
运行循环,并使用
ridx-1
Hi。我不完全清楚你的意思是我应该在不使用两个循环的情况下实现你的想法。下面的代码是我目前能想到的最好的代码,但是同样的4个测试用例仍然失败。问题说明“排名”和“玩家”列表最多可包含10e5个条目。代码:def攀登排行榜(_r,_p):ans=list()_r1=sorted(set(_r),reverse=True)len_r1=len(_r1)排名_子列表=_r1[1:]对于_p:crank=1中的pscore,如果pscore>=\u r1[0],则在开始评估玩家分数时将当前排名设置为1:…相同的逻辑。。。对于范围内的i(1,len_r1):…与之前相同的逻辑,但使用_r1[i]<\u r1[i-1]返回ansI,我想我理解您的意思。让我试试,看看能走多远。非常感谢。