【Python】リスト内の2つの数値を足して合計がkになるペアを探すプログラム
数値のリスト nums ともう一つの数値 k が与えられたとき、リスト内の任意の2つの数値を足した合計が k と一致するかどうかを判定するプログラムを作成します。ただし、同じ要素を2回使用することはできません。また、数値には負の数や0が含まれる場合もあります。
例えば、入力が nums = [45, 18, 9, 13, 12]、k = 31 の場合、18 + 13 = 31 となるため、出力は True になります。
解法のアプローチ
この問題は「セット(集合)」を使うことで効率的に解けます。各数値に対して、それとペアになるべき値(k - num、いわゆる補数)を事前にセットへ記録しておき、後からその値がリスト内に出現した時点でペアが存在すると判断できます。
具体的な手順は以下の通りです。
- 空のセット
temp_setを作成する nums内の各要素numについて以下を繰り返すnumがすでにtemp_setに存在する場合はTrueを返す(ペアが見つかった)- そうでなければ
k - numをtemp_setに追加する
- ループが完了しても見つからない場合は
Falseを返す
このアルゴリズムの計算量は、時間・空間ともに O(n) であり、全ペアを総当たりする O(n²) の方法よりも大幅に高速です。
実装例
class Solution: def solve(self, nums, k): temp_set = set() for num in nums: if num in temp_set: return True temp_set.add(k - num) return False ob = Solution() nums = [45, 18, 9, 13, 12] k = 31 print(ob.solve(nums, k))
入力
[45, 18, 9, 13, 12], 31
出力
True
コードのポイント
- セットによる高速な検索: セットへの要素の追加・存在確認は平均 O(1) で行えるため、全体の処理が高速になります。
- 補数の登録タイミング: 存在確認を先に行い、その後に補数を追加することで、同じ要素を2回使う誤判定(例:k=24 のとき 12+12 を同一要素で成立させるケース)を防げます。
- 負の数・0にも対応: 補数の計算
k - numは負の数や0でも正しく機能するため、特別な分岐は不要です。
-
Pythonで2つのリストの共通要素を求めるプログラム(積集合の計算方法)
リストの共通部分(Intersection/積集合)とは、2つのリストに共通して含まれるすべての要素を取り出し、それらを別の3つ目のリストに格納する操作のことです。 List1::[1,2,3] List2::[2,3,6] List3::[2,3] 上記の例では、List1とList2の両方に存在する「2」と「3」が抽出され、List3に格納されています。 アルゴリズム ステップ1:リストを入力する。 ステップ2:まず1つ目のリストの全要素を走査し、2つ目のリストの各要素と照合する。 ステップ3:要素が一致した場合、その値を3つ目のリストに格納する。 サンプルコード # 2つのリス
-
【Python】2つ以上のリストの和集合(ユニオン)を求めるプログラム
「和集合(ユニオン)」とは、複数のリストに含まれるすべての要素を集め、1つの新しいリストにまとめる操作のことです。本記事では、Pythonを使って2つ以上のリストの和集合を求める方法を、初心者にもわかりやすく解説します。 List1::[1,2,3] List2::[4,5,6] List3::[1,2,3,4,5,6] アルゴリズム ステップ1:2つのリストを入力として受け取る。 ステップ2:「+」演算子を使ってリストを連結(結合)する。 方法1:「+」演算子でリストを連結する Pythonでは「+」演算子を使うだけで、2つのリストを簡単に1つにまとめられます。以下のコードでは、まず