🙄

listの先頭に要素を入れていく方法

2024/06/21に公開

ただのメモです
競技プログラミングの勉強をしている中で、なにかしらの処理をした後、結果をlistの先頭に入れていく必要がありました。
そこで以下のようなコードを使っていました。

ans=[i]+ans

ただ、これだとTLE(処理時間超過)してしまいます。
代わりに以下を使うと問題なく動作しました。

ans.append(i)

# 最終的に以下のようにして提出
print(*reversed(ans))

感覚的にどちらも実行時間は同じなのかなーと思っていましたが、
最初のやつは、先頭に要素を入れるたびに既存の全ての要素を右にシフトする必要があります。
これにはO(n) の時間がかかり、挿入操作がk回行われる場合、全体の複雑さはO(k^2) になります。

後半のやつは、ただの末尾への追加O(1)の操作です。
最後にreversed(ans)を使ってリストを逆順にする操作はO(k)の時間がかかります。
このため、この部分の全体的な複雑さはO(k)のままです。

自分はCSの出身ではないので、こういうことにすぐ気づけなさそう
地道に学んでいくしかないですね

Discussion