Pythonでリスト内の3つの要素から最大の積を求めるプログラム
数値のリスト nums が与えられたとき、その中から3つの異なる要素を選んで掛け合わせたときの最大値を求める問題を考えてみましょう。
例えば、入力が nums = [6, 1, 2, 4, -3, -4] の場合、出力は 72 になります。これは、(-3) × (-4) × 6 = 72 となるためです。負の数同士を掛けると正の数になるため、小さな負の数2つと大きな正の数1つを組み合わせるのがポイントになります。
解法のアプローチ
この問題は、リストをソートすることで効率的に解くことができます。最大の積が得られる候補は次の2パターンだけだからです。
- 最小の2つの負の数 × 最大の正の数: 負の数2つを掛けると正になり、絶対値が大きいほど結果も大きくなります。
- 最大の3つの数の積: すべて正の数、または一般的なケースで最も単純な候補です。
具体的な手順は以下の通りです。
- リスト
numsを昇順にソートする nをリストのサイズとするmaxScoreを非常に小さい値(−無限大)で初期化するmaxScoreとnums[0] * nums[1] * nums[n-1](最小2つ×最大1つ)の大きい方をmaxScoreに代入するmaxScoreとnums[n-3] * nums[n-2] * nums[n-1](最大3つの積)の大きい方をmaxScoreに代入するmaxScoreを返す
実装例
それでは、実際のコードを見てみましょう。
def solve(nums):
nums.sort()
n = len(nums)
maxScore = float('-inf')
maxScore = max(maxScore, nums[0] * nums[1] * nums[n - 1])
maxScore = max(maxScore, nums[n - 3] * nums[n - 2] * nums[n - 1])
return maxScore
nums = [6, 1, 2, 4, -3, -4]
print(solve(nums))
入力
[6, 1, 2, 4, -3, -4]
出力
72
計算量について
この解法の時間計算量は、ソートに依存して O(n log n) となります。空間計算量は追加のデータ構造を使わないため O(1) です。全ての3要素の組み合わせを試す総当たり法(O(n³))と比べて、大幅に効率的であることがわかります。
-
Pythonで配列内の最大要素を見つける方法【初心者向け解説】
本記事では、配列の中から最大の要素を見つけるための解法とアプローチについて詳しく解説します。 問題の概要 配列が入力として与えられたとき、その中から最も大きい要素を見つけ出すことが課題となります。 アプローチ この問題は「線形探索」と呼ばれるシンプルな手法で解決できます。手順は以下の通りです。 まず、変数 max を配列の最初の要素で初期化します。 次に、2番目の要素から配列の末尾まで順番に走査していきます。 走査中の各要素について、現在の max の値と比較します。 要素が max より大きければ、max の値をその要素で更新します。 そうでなければ、そのまま次の要素へ進みます。 この処
-
Pythonで数値の一意な素因数の積を求める方法
この記事では、以下の問題文に対する解決策について学びます。問題文数値 n が与えられたとき、その数値が持つすべての一意な素因数の積を求めて返します。例入力: num = 11 出力: 積は 11説明ここでは、入力された数値は 11 であり、素因数は 11 のみです。したがって、その積は 11 となります。アプローチ1:総当たり法i = 2 から n+1 までの for ループを使用し、i が n の因数であるかどうかを確認します。因数であれば、さらに i 自体が素数かどうかを判定し、素数であれば product 変数に積を格納します。この処理を i が n になるまで繰り返します。コード例de