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

Pythonで欠落している数値を見つける方法|二分探索による効率的な解法

問題の概要

0からnまでの連続する整数で構成されたリストがあり、そのうち1つの数値だけが欠落しているとします。このとき、欠けている数値をできるだけ効率的に求めることが課題となります。

例えば、A = [0, 1, 2, 3, 4, 5, 7, 8, 9] というリストの場合、欠落している数値は 6 です。

二分探索を使った解法

この問題は、二分探索(バイナリサーチ)のアプローチを用いることで、O(log n) の時間計算量で効率的に解くことができます。

アルゴリズムの手順

  1. リストを昇順にソートする
  2. high をリストAの長さ、low を 0 として初期化する
  3. low < high である間、以下の処理を繰り返す
    • mid = low + (high - low) / 2 を計算する
    • A[mid] > mid であれば、high = mid とする(欠落位置は左側にある)
    • そうでなければ、low = mid + 1 とする(欠落位置は右側にある)
  4. ループ終了後、low の値を返す

実装例

以下は、上記のアルゴリズムをPythonで実装したコードです。

class Solution(object):
    def missingNumber(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        nums.sort()
        high = len(nums)
        low = 0
        while low<high:
            mid = low + (high-low)//2
            if nums[mid]>mid:
                high = mid
            else:
                low = mid+1
        return low
ob1 = Solution()
print(ob1.missingNumber([5,3,1,7,8,0,9,2,4]))

入力

nums = [5,3,1,7,8,0,9,2,4]

出力

6

コードの解説

ソート後のリストでは、欠落位置より前の要素は「インデックスと値が一致」し、欠落位置以降の要素は「値がインデックスよりも大きく」なります。二分探索によって、この境界となる最初の位置を絞り込んでいくことで、欠落している数値を正確に特定できます。

この手法は、全要素を線形に走査する O(n) のアプローチと比べ、計算量を O(log n) に抑えられるため、大規模なデータセットでも高速に動作するのが大きな利点です。

  1. Pythonで整数の桁を逆順に反転する方法を解説

    問題の概要 32ビット符号付き整数が与えられ、その各桁を逆順に並べ替えることを考えます。たとえば、入力が425であれば出力は524となります。また、整数は符号を持つため、負の数にも対応する必要があります。入力が-425の場合は、-524が出力されます。 前提条件と制約 この問題では、扱う値は32ビット符号付き整数の範囲、すなわち-2147483648 ~ 2147483647(-231 ~ 231-1)に収まるものとします。もし反転後の結果がこの範囲を超えてオーバーフローする場合は、関数は0を返します。 解き方のアプローチ この問題はPythonを使うと非常にシンプルに解けます。基本的な流

  2. Pythonで階乗を計算する3つの方法|forループ・再帰・math.factorial()の使い方

    階乗(factorial)の計算は、データ分析をはじめとする数学的な処理において、Pythonでよく求められる操作の一つです。階乗とは、正の整数 n に対して、1から n までのすべての整数を掛け合わせた値のことです(例:5! = 1 × 2 × 3 × 4 × 5 = 120)。この記事では、Pythonで階乗を求める3つの方法を、コード例と実行結果とともにわかりやすく解説します。方法1:forループを使うforループで1から目的の数値まで順番に処理し、各ステップで掛け算を繰り返していく方法です。以下のプログラムでは、ユーザーに数値の入力を促し、ループ処理の前にint()で入力値を整数に変換