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

Pythonで「良いトリプレット」の数を数えるプログラムの書き方

問題概要

配列 nums と、3つの異なる整数 a、b、c が与えられます。このとき、条件を満たす「良いトリプレット(good triplet)」の個数を求めるのが目的です。

トリプレット (nums[i], nums[j], nums[k]) が良いトリプレットとみなされるのは、以下の条件をすべて満たす場合です。

  • 0 <= i < j < k < nums の要素数
  • |nums[i] − nums[j]| <= a
  • |nums[j] − nums[k]| <= b
  • |nums[i] − nums[k]| <= c

たとえば、nums = [5,2,3,3,12,9]、a = 7、b = 2、c = 3 という入力の場合、出力は 4 になります。これは、(5,2,3)、(5,2,3)、(5,3,3)、(2,3,3) の4つの組み合わせが条件を満たすためです。

解法のアプローチ

この問題は、i < j < k を満たすすべてのインデックスの組み合わせを総当たり(ブルートフォース)で調べることで解けます。手順は以下の通りです。

  • 結果を格納する変数 res を 0 で初期化する
  • i を 0 から nums のサイズ − 1 までループさせる
  • j を i+1 から nums のサイズ − 1 までループさせる
  • k を j+1 から nums のサイズ − 1 までループさせる
  • 3つの絶対値の条件をすべて満たしていれば、res を 1 増やす
  • ループ終了後、res を返す

三重ループを使用するため、計算量は O(n³) となります。ただし、LeetCode の制約では配列の長さが最大100程度と小さいため、この単純な全探索でも十分に高速に動作します。

Pythonでの実装例

以下に実際のコードを示します。

def solve(nums, a, b, c):
    res = 0
    for i in range(len(nums)):
        for j in range(i+1, len(nums)):
            for k in range(j+1, len(nums)):
                if abs(nums[i] - nums[j]) <= a and abs(nums[j] - nums[k]) <= b and abs(nums[i] - nums[k]) <= c:
                    res += 1
    return res

nums = [5,2,3,3,12,9]
a = 7
b = 2
c = 3
print(solve(nums, a, b, c))

入力

[5,2,3,3,12,9], 7, 2, 3

出力

4

まとめ

「良いトリプレット」の問題は、絶対値を使った3つの条件を理解し、ネストしたループですべての組み合わせを確認するだけで解決できます。アルゴリズム自体はシンプルですが、インデックスの順序制約(i < j < k)を正しく扱うことがポイントです。競技プログラミングやコーディング面接の練習として、ぜひ手を動かして試してみてください。

  1. Pythonでリスト内の最小値を見つける方法を解説

    この記事では、リストの中から最小の数値を見つける方法について、具体的なサンプルコードとともに詳しく解説します。問題の概要問題: 数値のリストが与えられたとき、その中に含まれる最も小さい数値を画面に表示すること。この問題を解くアプローチは主に2つあります。ひとつは sort() メソッドを使ってリストを昇順に並べ替え、先頭の要素(インデックス0)を取得する方法。もうひとつは、Pythonに標準で用意されている組み込み関数 min() を使う方法です。それぞれ順番に見ていきましょう。方法1:sort()メソッドで並べ替えて最小値を取得するまずはリストを昇順にソートし、先頭の要素を取り出す方法です。

  2. Pythonプログラムで数の偶数の約数の合計を求める方法

    この記事では、以下の問題文に対する解決策について詳しく解説します。 問題文:ある数が与えられたとき、その数のすべての偶数の約数(因子)の合計を求めて表示します。 アプローチ まず、与えられた数が奇数であるかどうかを確認します。奇数には偶数の約数が存在しないため、その場合は 0 を返します。 数が偶数である場合は、実際の計算に進みます。ここでのポイントは、20(つまり1)以外のすべての項を掛け合わせることで、偶数の約数の合計が得られるという点です。 偶数の約数からすべての奇数を取り除くために、20 に相当する「1」を無視します。この処理を行うことで、残るのは偶数の約数のみとなります。なお、2 は