私はHackerranksの「新年カオス」問題のために私のソリューションを最適化しようとしています。問題の要点は次のようになります(問題hereへのリンク):1からnまでのn人のキューがあり、それぞれの人が自分の前に直接賄賂をかけて場所を交換し、キュー(この場合、リスト/配列のインデックス0)。それぞれの人は最大2回しか賄賂を取ることができません(すでに賄賂を贈った人に賄賂を贈ることはできません)。賄賂がすべて払われた後、あなたはその人の秩序が与えられ、あなたの仕事は、その時点までにいくつの賄賂が取られたのかを判断することです。例えば、あなたが[3,2,1]を与えられた場合、答えは3つの賄賂(賄賂を贈られた人1と2と賄賂を贈られた人1)です。私の解決策は、各人のために、私よりも大きいラベルを持っている私の左の人の数を数えることでした(彼らは彼らの左に行くために人に賄賂を払わなければならなかったでしょう)。 (わずかに)事を複雑にするために、与えられたテストケースのうちのいくつかは、誰かが2回以上の贈り物をした場合にのみ可能です(すなわち、[4,1,2,3] - 4人の賄賂を受けた人3、次に2人、フロント)。このような場合は、単に「あまりにも混乱します」と出力してください。とにかく、ここのコードです:hackerrank新年カオスコードの最適化
# n is the number of people in the list
# q is the order of the people after the bribery has taken place ex. [1, 3, 2, 5, 4]
for i in range(1, n + 1): # for each person i in the list
index = q.index(i)
if i - index > 3: # more than two bribes
bribes = "Too chaotic"
break
for j in range(index): # for each number to the left of i, if greater than i, count it as a bribe
if q[j] > i:
bribes = bribes + 1
print bribes
私の問題は、大きなテストケースの一部とアウトコード時間は(あなたが唯一の各テストケースを実行するために多くの時間を与えられている)ということです。アルゴリズムをタイムアウトしないように最適化するにはどうすればよいですか?この問題を別の言語で試してみるべきですか?
ご協力いただきありがとうございます。
こんにちは、私が[3、2、4、1]を持っていたらどうなりますか? [1,2,3,4]→[2,1,3,4]→[2,3,1,4]→[3,2,1,4]→[2、3、4]→[ 3,2,4,1]である。私があなたのアプローチを正しく理解していれば、あなたのアルゴリズムは4が実際に起こったときに3の賄賂の結果をもたらすでしょう。私はここに何かを逃していますかありがとう – Matt
こんにちは@Matt、私はあなたの外側のループが最初の要素から最後の要素までであることに気付かなかった。実際には、最後のものから最初のものまで繰り返す必要があります。私の更新された答えを見てください。テストケースを実行して、これらの2つの異なる方法をテストすることができます。これを試してください:1 2 5 3 7 8 9 6 4。 –