集合で同じ値が 2 回出てくるかを確かめる

整数の並びの中に、同じ値が 2 回以上出てくるかを判定します。見た値を集合に覚え、出てきた値がもう集合にあるかを一定の手間で調べる練習です。

海外で定番の問題リスト 4 本のうち 3 本に入っています (Blind 75、NeetCode 150、Grind 75)

問題

整数の並び nums を受け取ります。nums の中に、同じ値が 2 回以上出てくるなら真、どの値も 1 回しか出てこないなら偽を返す関数を書いてください。

  • 位置が違っても値が同じなら、同じ値とみなします。5 と -5 は別の値です
  • nums の長さは 1 以上 100000 以下、値はどれも絶対値が 10 億以下です

入力と出力の例

例 1

nums = [4, 9, 2, 9, 7]
true

例 2

nums = [15, -3, 8, 0]
false

例 3

同じ値が離れた位置にあっても、見つけられる必要があります。

nums = [-7, 7, 0, 3, -7]
true

面接での聞かれ方

面接の最初の 1 問として、短く出されることが多い問題です。

  • 「整数の配列に重複があるかを返してください」
  • 書き終えたあとに「計算量は?」「メモリを使わずに解くとどうなりますか?」と、時間と記憶の取り引きを聞かれます
  • 「重複が見つかったら、すぐに止められますか?」と、早く打ち切れるかを聞かれることもあります

答えは真か偽だけなので、すぐに書けます。そのぶん、ほかの書き方と比べて計算量を言えるかが見られています。

ヒント

まだ開いていません

付箋は 3 枚。下の段ほど答えに近づきます

  1. ヒント 2

  2. ヒント 3答えに近い

アルゴリズムのチートシートの「ハッシュマップ」に、この型の要点を表とコードでまとめています。

ハッシュは、値から番地を計算して、探す手間をほぼ 1 回にする仕組みです。重複や回数の問題は、この形で解けます。

main.py
def has_duplicate(nums: list[int]) -> bool:
    """
    Goal: 何を返すか

    idea1: まず思いつく案
    -> runtime: O(?)  space: O(?)

    idea2: もっと速い案
    -> runtime: O(?)  space: O(?)

    edge case: 空、1 つだけ、など
    """
    # ここに書きます
    pass


# 「実行」を押すと、この行の結果が出ます
print(has_duplicate([4, 9, 2, 9, 7]))

できているか「例で確かめる」を押すと、問題の例を全部この関数に渡して、通ったかをここに出します