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

Pythonでリスト内の3つの異なる要素の合計がkと一致するか判定するプログラム

数値のリスト nums と値 k が与えられたとき、リストの中から合計が k と等しくなる3つの異なる要素を見つけられるかどうかを判定します。

たとえば、入力が nums = [11, 4, 6, 10, 5, 1]k = 20 の場合、[4, 6, 10] の合計が 20 になるため、出力は True となります。

解法の考え方

この問題は、リストをソートしたうえで双方向ポインタ(two-pointer)を組み合わせることで、総当たりよりも効率的に解くことができます。手順は以下の通りです。

  • リスト nums を昇順にソートする
  • 左端を指す l = 0、右端を指す r = len(nums) - 1 として初期化する
  • l < r - 1 の間、次の処理を繰り返す
    • 3つ目の候補となる値 t = k - nums[l] - nums[r] を計算する
    • nums[r - 1] < t の場合、それ以上大きな値は存在しないため l を1つ進めて次へ
    • ml + 1 から r - 1 まで走査し、
      • nums[m] > t なら r を1つ減らして範囲を狭める
      • nums[m] == t なら True を返す
  • 最後まで見つからなければ False を返す

実装例

理解を深めるために、実際のPythonコードを見てみましょう。

class Solution:
    def solve(self, nums, k):
        nums.sort()
        l, r = 0, len(nums) - 1
        while l < r - 1:
            t = k - nums[l] - nums[r]
            if nums[r - 1] < t:
                l += 1
                continue
            for m in range(l + 1, r):
                if nums[m] > t:
                    r -= 1
                    break
                if nums[m] == t:
                    return True
        return False

ob1 = Solution()
nums = [11, 4, 6, 10, 5, 1]
k = 20
print(ob1.solve(nums, k))

入力

[11, 4, 6, 10, 5, 1], 20

出力

True

計算量について

ソートに O(n log n)、その後の探索では左右のポインタが互いに近づきながら全体で O(n²) の処理となるため、すべての組み合わせを調べる O(n³) の素朴な手法よりも大幅に高速です。リストのサイズが大きい場合でも実用的に動作する点がこのアプローチの大きな利点といえます。

  1. Pythonでリスト内の要素の合計を求める3つの方法

    この記事では、Pythonでリスト(イテラブル)内の全要素の合計値を計算する方法について解説します。問題の概要与えられたリストの各要素を足し合わせ、その合計値を求めることが目的です。本記事では、以下の3つのアプローチを順番に紹介します。forループを使用する方法whileループを使用する方法再帰関数を使用する方法方法1:forループを使用するrange()関数でインデックスを生成しながらリストを反復処理し、各要素を順番に加算していきます。コード例# 合計を保持する変数 total = 0 # リストを作成 list1 = [11, 22, 33, 44, 55, 66] # リストを反復処理

  2. リスト内の要素の合計を求めるPythonプログラム

    この記事では、Pythonを使ってリスト内のすべての要素の合計を求める方法について、具体的なコード例とともに解説します。問題の定義リストが入力として与えられたとき、そのリストに含まれるすべての要素の合計値を計算する必要があります。例えば、[1, 2, 3, 4, 5]というリストが与えられた場合、出力は 15(1+2+3+4+5)となります。この問題を解くためのアプローチは主に2つあります。1つは組み込み関数を使用する方法、もう1つはブルートフォース(総当たり)方式でループ処理を行う方法です。方法1:組み込み関数 sum() を使うPythonには標準で用意されている組み込み関数 sum()