Pythonで連続する部分配列の最大積を求めるプログラム
nums という配列が与えられたとき、少なくとも1つの要素を含む「連続した部分配列」の中から、要素の積が最大になるものを見つけて、その積を返すことを考えます。例えば、配列が [1,9,2,0,2,5] の場合、連続する部分配列 [1,9,2] の積が最大となるため、出力は 18 になります。
解法のアプローチ
この問題は動的計画法(DP)を使って効率的に解くことができます。ポイントは、負の数同士を掛けると正の数になる可能性があるため、各位置における「最大積」と「最小積」の両方を追跡することです。
具体的な手順は以下の通りです。
max_list:nums と同じサイズのリストを作成し、0で初期化するmin_list:nums と同じサイズのリストを作成し、0で初期化する- i を 1 から nums の長さ - 1 まで繰り返し処理する
max_list[i] = max(max_list[i-1]*nums[i], min_list[i-1]*nums[i], nums[i])min_list[i] = min(min_list[i-1]*nums[i], nums[i], max_list[i-1]*nums[i])
- 最後に
max_listの最大値を返す
この方法では、時間計算量・空間計算量ともに O(n) で問題を解くことができます。
実装例
以下のコードで、より理解を深めましょう。
class Solution(object):
def maxProduct(self, nums):
max_list = [0] * len(nums)
min_list = [0] * len(nums)
max_list[0] = nums[0]
min_list[0] = nums[0]
for i in range(1,len(nums)):
max_list[i] = max(max(max_list[i-1]*nums[i],min_list[i-1]*nums[i]),nums[i])
min_list[i] = min(min(min_list[i-1]*nums[i],nums[i]),max_list[i-1]*nums[i])
return max(max_list)
ob1 = Solution()
print(ob1.maxProduct([1,9,2,0,2,5]))
入力
[1,9,2,0,2,5]
出力
18
-
Pythonですべての連続する部分配列の合計を求めるプログラム
問題概要数値のリスト nums が与えられたとき、その中のすべての連続する部分配列(サブリスト)を考えます。それぞれの部分配列の合計を計算し、さらにそれらの総和を求めます。最後に、結果を 10 ** 9 + 7(1,000,000,007)で割った余りを返します。例えば、入力が nums = [3, 4, 6] の場合、出力は 43 になります。考えられる部分配列は以下の通りです。[3][4][6][3, 4][4, 6][3, 4, 6]これらすべての合計を足すと 3 + 4 + 6 + 7 + 10 + 13 = 43 となります。解法のアプローチすべての部分配列を実際に生成して合計を計算
-
Pythonで解く最大積部分配列問題【動的計画法の実装例】
問題の概要 整数配列 nums が与えられたとき、配列内の連続する部分配列(少なくとも1つの要素を含む)の中で、積が最大になるものを見つける問題です。 例えば、配列が [2,3,-2,4] の場合、出力は 6 になります。これは連続する部分配列 [2,3] の積 2×3=6 が最大だからです。 解法のアプローチ この問題は動的計画法(DP)を活用して解くのが効果的です。重要なポイントは、配列に負の数が含まれる可能性があることです。負の数同士を掛け合わせると正の数になるため、それまでの「最小の積」が突然「最大の積」に変わることがあります。 そこで、各インデックスにおいて「その位置で終わる部分配