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

Pythonで配列内の「良いペア」の数を数えるプログラム

問題の概要

整数の配列 nums が与えられたとします。ここで、ペア (i, j)nums[i]nums[j] の値が等しく、かつ i < j を満たすときに「良いペア(good pair)」と定義されます。この記事では、配列の中に良いペアがいくつ存在するかを数える方法を解説します。

例えば、入力が nums = [5,6,7,5,5,7] の場合、出力は 4 になります。これは、インデックスの組み合わせ (0, 3)(0, 4)(3, 4)(2, 5) の4つが条件を満たすためです。

解き方の手順

基本的なアプローチは、すべてのペアの組み合わせを調べて条件に一致するものをカウントすることです。手順は以下の通りです。

  • カウンター変数 count を 0 で初期化します。
  • 配列のサイズを n として取得します。
  • 外側のループで i を 0 から n-1 まで動かします。
  • 内側のループで j を i+1 から n-1 まで動かします。
  • nums[i] == nums[j] が成り立つ場合は count を 1 増やします。
  • 最後に count を返します。

Pythonでの実装例

実際のコードを見てみましょう。

def solve(nums):
    count = 0
    n = len(nums)
    for i in range(n):
        for j in range(i + 1, n):
            if nums[i] == nums[j]:
                count += 1
    return count

nums = [5, 6, 7, 5, 5, 7]
print(solve(nums))

入力と出力

入力:

[5, 6, 7, 5, 5, 7]

出力:

4

計算量について

この二重ループによる解法の時間計算量は O(n²) です。配列のサイズが小さいうちは問題ありませんが、要素数が数千〜数万になると処理が遅くなる点に注意が必要です。

より効率的な解法:Counterを使う方法

数学的な性質を利用すると、計算量を O(n) まで削減できます。ある値が配列内に k 回出現するとき、その値から作れるペアの数は組み合わせの公式 k × (k − 1) / 2 で求められます。

from collections import Counter

def solve(nums):
    counter = Counter(nums)
    return sum(v * (v - 1) // 2 for v in counter.values())

nums = [5, 6, 7, 5, 5, 7]
print(solve(nums))  # 出力: 4

この方法では各値の出現回数を一度だけ数えればよいため、大きなデータセットでも高速に動作します。用途やデータ規模に応じて、両方のアプローチを使い分けるとよいでしょう。

  1. Pythonで二分木の「良い」葉ノードペアの数を求めるプログラム

    問題の概要 二分木と整数値 d が与えられます。異なる2つの葉ノードからなるペアのうち、両ノード間の最短経路の長さが d 以下であるものを「良いペア(good pair)」と呼びます。この記事では、Pythonを使って木の中に良いペアがいくつ存在するかを求める方法を解説します。 たとえば、次のような二分木を考えてみましょう。 この木に対して d = 4 とした場合、答えは 2 になります。(8, 7) と (5, 6) の2つのペアは経路長がどちらも 2 で d 以下だからです。一方、(7, 5) や (8, 6) などのペアは経路長が 5 になり、d = 4 を超えるため良いペアとして数

  2. Pythonでリスト内の最大値を見つける方法|sort()とmax()の2つのアプローチ

    この記事では、リストの中から最大の数値を見つけるための解決策とアプローチについて詳しく解説します。問題の概要数値のリストが与えられたとき、その中から最大の要素を見つけ出す必要があります。Pythonでは、主に以下の2つの方法でこれを実現できます。ソート(並べ替え)を利用する方法組み込み関数 max() を利用する方法アプローチ1:sort() 関数を使う方法リストを sort() メソッドで昇順に並べ替えると、リストの最後の要素(インデックス -1)が必ず最大値になります。サンプルコードlist1 = [18, 65, 78, 89, 90] list1.sort() # メイン処理 prin