1からNまでのユニークな番号を持つN(3 < = N < = 50000)カードが与えられます。 カードを3枚失ってしまいました。失われたカードを見つける(より速い解決策)
入力は:自分のキューブの我々が持っているすべての左のカードの合計、彼らの二乗の和と合計:最初の行は セカンドラインは、3つの数字が含まれているカードNの数が含まれています。
出力:任意の順序で3枚のカードが失われました。
ここで私が試したことは:紛失したカードについて同じ3つの合計を見つけ、そのうち3つが合計を満たすまで、可能な数をチェックします。
高速なソリューションはありますか?私は、最大NとPythonで2秒の制限時間を通過しなければならない= 50000
N = int(input())
lst = list(range(1, N+1))
s_rest, s2_rest, s3_rest = list(map(int, input().split()))
s = sum(lst)
s2 = sum([x**2 for x in lst])
s3 = sum([x**3 for x in lst])
# sums of 3 lost numbers
s_lost = s - s_rest
s2_lost = s2 - s2_rest
s3_lost = s3 - s3_rest
def find_numbers():
"""Find first appropriate option"""
for num1 in range(s_lost):
for num2 in range(s_lost):
for num3 in range(s_lost):
if (num1 + num2 + num3 == s_lost) and (num1**2 + num2**2 + num3**2 == s2_lost)\
and (num1**3 + num2**3 + num3**3 == s3_lost):
return (num1, num2, num3)
answer = find_numbers()
print(answer[0], answer[1], answer[2])
例
入力:
出力:
入力:
出力:
[簡単なインタビューの質問はより難しくなった:与えられた数1.100、見つからない数を見つける] //stackoverflow.com/questions/3492302/easy-interview-question-got-harder-given-numbers-1-100-find-the-missing-numbe) –
Nが小さい(最大50000)とすると、何が問題なのか'set(range(1、N + 1))。difference(input_numbers)'で?これは、Nでこの制約が与えられていることを示唆したものよりはるかに簡単な問題であり、O(1)ストレージではなくO(N)ストレージを使用する単純なセットベースの問題がうまくいきます。 –