動的計画法で 最大と 最小の 積を 持ち 歩き、 積が 最大の 続いた 区間を求める
負の
海外で定番の問題リスト 4 本には入っていません
問題
整数のnums をnums の
- 区間は 1 つ以上の
要素を 含みます。 空の 区間は 選べません numsの長さは 1 以上 1000 以下で、 どの 値も -10 以上 10 以下の整数です numsの先頭から、 または 末尾からの どの 区間の 積も、 -2^31 以上 2^31 未満に 収まる ものとします
入力と出力の例
例 1
負の
例 2
全部を[4, -1, -5] の 20 が
例 3
0 を0 だけの
面接での聞かれ方
面接では、
- 「続いた
区間の 積が 最大に なる値を 返してください」 - 和の
書き方を そのまま 積に 替えて 書くと、 「負の 数が 2 つ あったら?」と 聞き返されます - 「0 があったら?」
「全部が負なら?」と、 端の 場合を 順に 聞かれる ことが多いです
和と
ヒント
まだ開いていません
付箋は 4 枚。下の段ほど答えに近づきます
ヒント 2
ヒント 3
ヒント 4答えに近い
アルゴリズムのチートシートの「動的計画法 (DP)」に、
関わる学び
動的計画法は、
まず 考える手順
段 1
始まりと
段 2
和の
段 3
そこで、hi とlo を 2 つhi × x、lo × x の 3 つのhi、lo です。
段 4
各位置での hi のhi、lo、nums[0] です。
解答
Python
Python
def max_product(nums):
hi = lo = best = nums[0]
for x in nums[1:]:
a = hi * x
b = lo * x
hi = max(x, a, b)
lo = min(x, a, b)
best = max(best, hi)
return bestJavaScript
JavaScript
function maxProduct(nums) {
let hi = nums[0];
let lo = nums[0];
let best = nums[0];
const rest = nums.slice(1);
for (const x of rest) {
const a = hi * x;
const b = lo * x;
hi = Math.max(x, a, b);
lo = Math.min(x, a, b);
best = Math.max(best, hi);
}
return best;
}Go
Go
func maxProduct(
nums []int,
) int {
hi := nums[0]
lo, best := hi, hi
for _, x := range nums[1:] {
a := hi * x
b := lo * x
hi = max(x, a, b)
lo = min(x, a, b)
best = max(best, hi)
}
return best
}a と b をhi と lo をhi をlo のhi が
計算量
- 時間は O(n) です (n は
numsの長さ)。 1 つずつ 1 回見ます - 使う
記憶は O(1) です。 持つのは hi、lo、答えの 3 つだけです - 段 1 の
全部の 組を 試す 書き方は、 時間が O(n²) です
よく ある間違い
- 最大だけを
持ち歩く。 和と 同じ形で hiだけを持つと、 例 1 で 12 を 返します。 -3 の 所で 最小の -6 を 捨ててしまい、 次の -4 と 掛けた 24 が 作れないからです hiを先に 書き換えてから loを計算する。 書き換えた 後の hiでloを求めると、 x が 負の ときに 大小が ずれます。 例 2 で 20 に ならなければ、 まず ここを見ます - 答えの
始めを 0 にする。 nums = [-3]のように負の 数が 1 つだけの とき、 0 を 返してしまいます。 空の 区間は 選べないので -3 が答えです
解答を動かした版 Python 3.14.7Node.js 24.22.1Go 1.24.2確認日 2026年11月8日
面接での 話し方の例
書き始める
「和なら、
そこで 終わる 区間の 最大だけを 持てば足ります。 積は 負の 数で 大小が 入れ替わるので、 そこで 終わる 区間の 最大と 最小の 2 つを 持ちます。 次の 値 x で 終わる 区間は、 x だけ、 最大 × x、 最小 × x の どれかなので、 3 つから 新しい 最大と 最小を 選びます。 時間は O(n)、 記憶は O(1) です。」
書き終えたら、
「例 1 の
[2, -3, -4, 1]でたどります。 始めは 最大も 最小も 2 です。 -3 では、 -3、 -6、 -6 から 最大 -3、 最小 -6 です。 -4 では、 -4、 12、 24 から 最大 24、 最小 -4 です。 1 では 最大 24 のままなので、 答えは 24 です。」