Python
 Computer >> コンピューター >  >> プログラミング >> Python

【Python】配列の中で欠けている最小の正整数を見つける方法

数値のリスト nums が与えられたとき、その中に存在しない「最初の正の整数」、すなわち欠けている最小の正整数を見つける問題を考えます。配列には重複した値や負の数が含まれる可能性がある点に注意が必要です。

例えば、入力が nums = [0, 3, 1] の場合、出力は 2 となります。0・1・3 は存在しますが、2 だけが欠けているためです。

解決のアプローチ

この問題は、集合(set)を使うことでシンプルかつ効率的に解くことができます。手順は以下の通りです。

  • nums から正の数のみを取り出して集合を作成する(負の数と重複は自動的に除外される)
  • 集合が空の場合は、正の数が一つも存在しないため 1 を返す
  • 1 から「集合のサイズ + 2」まで順番に確認し、集合に存在しない最初の値を返す

実装例(Pythonコード)

class Solution:
    def solve(self, nums):
        nums = set(num for num in nums if num > 0)

        if not nums:
            return 1
        for i in range(1, len(nums) + 2):
            if i not in nums:
                return i

ob = Solution()
nums = [0, 3, 1]
print(ob.solve(nums))

入力

[0, 3, 1]

出力

2

計算量について

このアルゴリズムの時間計算量は O(n)、空間計算量も O(n) です(n は配列の要素数)。集合を使用することで、各値の存在確認を平均 O(1) で実行できる点が大きなポイントです。また、探索範囲を「サイズ + 2」まで設定しているのは、配列が [1, 2, ..., n] のように完全に連続しているケースでも、次の欠落値 n+1 を確実に検出できるようにするためです。

  1. Pythonで配列内の最大の要素を見つける方法を解説

    この記事では、「配列の中から最大の要素を求める」という問題の解決方法について詳しく解説します。 問題の概要 問題文:与えられた配列に対して、その中で最も大きい要素を計算して求める必要があります。 ここではブルートフォース(総当たり)アプローチを使用します。これは、配列全体を先頭から順番に走査しながら各要素を比較し、その時点での最大値を更新していくというシンプルかつ確実な手法です。 実装例 以下に具体的なコードを示します。 # 最大値を求める関数 def largest(arr, n): # 最大要素の初期値として最初の要素を設定 max = arr[0] # 配列全体を

  2. Pythonで配列(リスト)の合計を求める方法をわかりやすく解説

    この記事では、配列(リスト)の合計値を求めるという問題に対して、Pythonでの解決策とアプローチをわかりやすく解説します。 問題の定義 配列が入力として与えられたとき、その配列に含まれるすべての要素の合計を計算することを目標とします。 例えば、[1, 2, 3, 4, 5] という配列が与えられた場合、出力は 15 になります。 アプローチ1:ループを使った素朴な方法(総当たり法) 最も基本的な方法は、リストを先頭から順に走査し、各要素を合計用の変数に加算していくやり方です。手順は以下の通りです。 合計を格納する変数を 0 で初期化します。 for ループでリストの各要素を取り出し、順番に