Pythonで配列内の2つの異なる要素の最大積を求める方法
数値のリスト nums が与えられたとき、その中から2つの異なる要素を選んで掛け合わせた値の最大値(最大積)を求めたい場面はよくあります。
例えば、入力が nums = [8, -3, 1, -5] の場合、出力は 15 となります。これは (-3) × (-5) = 15 となり、他のどの組み合わせよりも大きいためです。
ポイント:負の数同士の積に注意
この問題で重要なのは、負の数同士を掛けると正の数になるという性質です。そのため、最大の積は以下の2パターンのいずれかから生まれます。
- リスト内の最も大きい2つの要素の積
- リスト内の最も小さい(負の)2つの要素の積
したがって、リストをソートして両端の組み合わせを比較すれば、答えを効率的に求められます。計算量はソートに伴い O(n log n) です。
解法のアルゴリズム
以下の手順で問題を解くことができます。
nをリストnumsのサイズとするnums_sortとしてリストを昇順にソートするmax_leftを最小の2要素の積(nums_sort[0] * nums_sort[1])とするmax_rightを最大の2要素の積(nums_sort[n-1] * nums_sort[n-2])とするansをmax_leftとmax_rightの大きい方とするansを返す
実装例
理解を深めるために、実際のPythonコードを見てみましょう。
def solve(nums):
nums_sort = sorted(nums)
max_left = nums_sort[0] * nums_sort[1]
max_right = nums_sort[-1] * nums_sort[-2]
ans = max(max_left, max_right)
return ans
nums = [8, -3, 1, -5]
print(solve(nums))入力
[8, -3, 1, -5]
出力
15
コードの解説
この実装では、まず sorted() 関数を使って元のリストを昇順に並べ替えています。Pythonでは负のインデックスが使えるため、nums_sort[-1] と nums_sort[-2] でそれぞれ最大値と2番目に大きい値を簡単に取得できます。
その後、先頭の2要素(最小値同士)の積と、末尾の2要素(最大値同士)の積を max() 関数で比較し、大きい方を答えとして返しています。これにより、すべての組み合わせを総当たりで確認する O(n²) の方法よりもはるかに効率的に最大積を求められます。
-
Pythonでリスト内の2つの異なる要素から最大の積を求めるプログラム
はじめに数値のリストが与えられたとき、その中から異なる2つの要素を選び、その積(掛け算の結果)の最大値を求める問題を考えてみましょう。例えば、入力が [5, 3, 7, 4] の場合を考えます。このとき最大の積は 7 × 5 = 35 となります。解き方のアプローチ最もシンプルな方法は、全ての要素ペアの組み合わせを調べる総当たり(ブルートフォース)による解法です。手順は以下の通りです。現在の最大値を保持する変数 curr_max を負の無限大(-inf)で初期化します。外側のループでインデックス i を 0 から要素数 - 1 まで回します。内側のループでインデックス j を i + 1 から
-
PythonでリストからN個の最大要素を取得する方法
整数のリストが与えられたとき、その中からN個の大きな要素を取り出して新しいリストとして返すのが、ここでの課題です。本記事では、基本的なループ処理による方法から、Python標準ライブラリを活用した効率的な方法まで、サンプルコードとともに解説します。 例 入力 : [40, 5, 10, 20, 9] N = 2 出力 : [40, 20] アルゴリズム 整数のリストと、取得する要素数Nを受け取ります。 N回のループを実行します。 各ループでリスト内の最大値を探し、新しいリストに格納すると同時に元のリストから削除します。 実装コード def Nnumberele(list1, N):