簡體   English   中英

超過Python時間限制

[英]Python time limit exceeded

我是編程新手,我的老師要求全班在法官系統URI中進行練習

當我嘗試執行此練習時 ,URI系統說我的代碼超出了限制時間,並在2秒內運行。 我的代碼是:

cont=0
cont_register=int(input())
coords=[]
for i in range(cont_register):
    coords.append(input())
for i in range(0, cont_register):
    if coords.count(coords[i])>1:
        cont=1
        break
    else:
        cont=cont
print(cont)

輸出總是正確的,但是我想知道是否存在優化運行時間的表格,因為cont_register是2到500.000之間的數字

嘗試使用collections.Counter

from collections import Counter

cont_register=int(input())

coords=[]

for i in range(cont_register):
    coords.append(raw_input())

coords=Counter(coords)

print(int(coords.most_common(1)[0][1] > 1))

如果您可以檢查input內容,這是最快的選擇:

cont_register=int(input())
seen = set()
cont = 0
for i in range(cont_register):
    new = input()
    if new in seen:
        cont = 1
        break
    else:
        seen.add(new)
print(cont)

循環中的coords.count是對整個列表的另一次搜索,因此使運行時為O(n ^ 2)。 您可以改用字典,該字典可實現哈希表,並使搜索更快,並在接受輸入的同時進行重復檢查(對於已經接受的輸入!)。

此代碼與python3一起運行。 我無法與URI法官聯系,因為我在頁面上找不到任何提交鏈接。 但是,它應在限制范圍內運行。

cont=0
cont_register=int(input())
coords={}
for i in range(0,cont_register):
    inp=input()
    if inp not in coords.keys():
        coords[inp]=1
    else:
        cont=1
        break #if you don't want to continue taking inputs
print(cont)

一種簡單的方法是使用嵌套列表(在C / C ++ / etc中也稱為2D數組)標記已經訪問過的象限。

您一個接一個地遍歷輸入中的條目,並檢查它們是否已被訪問。 如果是這樣,則將答案設置為1並停止處理其他輸入。 否則,將seen列表中的相應條目設置為True,以指示已經訪問了特定的(X,Y)象限。

這意味着您最多需要遍歷列表一次,這與您獲得的效率差不多。

請注意,X和Y被限制為小於500,因此這些是您需要擔心的列表的限制。

seen = [[False] * 501] * 501 
answer = 0
n = int(input())
for i in range(n):
    x, y = [int(_) for _ in input().split(' ')]
    if seen[x][y]:
        answer = 1
        break
    seen[x][y] = True
print(answer)

但是,請注意,此解決方案並不完全是Pythonic,而是大致相當於在不使用標准庫的情況下用C或C ++所做的事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM