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

Pythonでリスト内の2つの異なる要素から最大の積を求めるプログラム

はじめに

数値のリストが与えられたとき、その中から異なる2つの要素を選び、その積(掛け算の結果)の最大値を求める問題を考えてみましょう。

例えば、入力が [5, 3, 7, 4] の場合を考えます。このとき最大の積は 7 × 5 = 35 となります。

解き方のアプローチ

最もシンプルな方法は、全ての要素ペアの組み合わせを調べる総当たり(ブルートフォース)による解法です。手順は以下の通りです。

  • 現在の最大値を保持する変数 curr_max を負の無限大(-inf)で初期化します。
  • 外側のループでインデックス i を 0 から要素数 - 1 まで回します。
  • 内側のループでインデックス ji + 1 から要素数 - 1 まで回し、同じペアを重複して調べないようにします。
  • nums[i] * nums[j]curr_max より大きければ、curr_max を更新します。
  • すべてのペアを確認した後、curr_max を返します。

実装例

class Solution:
    def solve(self, nums):
        curr_max = float('-inf')
        for i in range(len(nums)):
            for j in range(i+1, len(nums)):
                if nums[i] * nums[j] > curr_max:
                    curr_max = nums[i] * nums[j]
        return curr_max

ob = Solution()
print(ob.solve([5, 3, 7, 4]))

入力

[5, 3, 7, 4]

出力

35

計算量について

この総当たりの解法では、2重ループを使用するため時間計算量は O(n²) となります。リストのサイズが小さい場合は十分実用的ですが、要素数が多い場合には効率が低下します。

より効率的な代替案:ソートを利用する方法

リストをあらかじめ昇順にソートしておけば、最大の積は以下のいずれかになります。

  • 最も大きい2つの要素の積(末尾の2要素)
  • 最も小さい2つの要素(負の数同士)の積

この性質を使うと、時間計算量 O(n log n) で解くことができます。

class Solution:
    def solve(self, nums):
        nums.sort()
        return max(nums[0] * nums[1], nums[-1] * nums[-2])

特に注意が必要なのは、リストに負の数が含まれるケースです。例えば [-10, -9, 1, 3] のような場合、最大の積は -10 × -9 = 90 となり、正の大きな数同士の組み合わせではなく、負の数同士の組み合わせが答えになります。上記のソートを使った方法なら、こうしたケースも自動的にカバーできます。

まとめ

本記事では、Pythonでリスト内の2つの異なる要素から最大の積を求める方法を紹介しました。理解しやすい総当たり法と、実務で有利なソート活用法の両方を押さえておくと、面接や実装の場面で役立ちます。

  1. Pythonで配列内の最大の要素を見つける方法を解説

    この記事では、「配列の中から最大の要素を求める」という問題の解決方法について詳しく解説します。 問題の概要 問題文:与えられた配列に対して、その中で最も大きい要素を計算して求める必要があります。 ここではブルートフォース(総当たり)アプローチを使用します。これは、配列全体を先頭から順番に走査しながら各要素を比較し、その時点での最大値を更新していくというシンプルかつ確実な手法です。 実装例 以下に具体的なコードを示します。 # 最大値を求める関数 def largest(arr, n): # 最大要素の初期値として最初の要素を設定 max = arr[0] # 配列全体を

  2. Pythonで数値が2の累乗かどうかを判定するプログラム

    本記事では、与えられた数値が2の累乗(べき乗)であるかどうかを判定する方法について、考え方と実装手順をわかりやすく解説します。 問題の定義 ある整数 n が与えられたとき、その数が2の累乗(1, 2, 4, 8, 16, …)であるかどうかを判定します。 アプローチ 判定には「繰り返し2で割る」というシンプルな方法を使います。考え方は以下の通りです。 入力された数値 n を、1になるまで繰り返し2で割っていきます(n = n // 2)。 割る過程で n % 2 の結果が0以外(奇数)になり、かつ n が1でない場合は、その数は2の累乗ではありません。 最終的に n がちょうど1になれば、そ