Maximum Subarray
部分配列とは、リストの要素が途切れることなく並んだ連続部分です。整数のリストに含まれる空でないすべての部分配列のうち、要素の合計が最大になるものを見つけ、その合計を返します。
[2, -4, 3, -1, 5, -6, 1]では、最適な連続部分は[3, -1, 5]で、合計は7です。その後に続く5が-1の損失を十分に補うため、-1を含めます。一方、先頭の2は、その後の-4による損失のほうが2のもたらす利益より大きいため、含めません。
古典的な1回の走査で解く方法はKadane's algorithmです。リストを順に見て、現在の要素で終わる連続部分の合計の最大値を保持します。各要素では、前の要素で終わった連続部分を延長するか、ここから始まる新しい連続部分で再開するかの2つの選択肢しかありません。前の連続部分の合計が正の間だけ延長する価値があります。その合計が0以下になったら、引き継いでも不利になるだけなので、最初から始めます。答えは、途中で得られた連続部分の合計の最大値です。
この例では、各位置で終わる連続部分の合計の最大値は、2、-2、3、2、7、1、2となるため、答えは7です。各要素を1回ずつ見るので、処理量はリストの長さに対して線形に増加します。
整数のリスト nums を受け取り、nums の空でない連続部分配列の最大の合計を返す、maxSubArray という名前の関数を書いてください。
制約: 1 ≤ nums.length ≤ 10^5、-10^4 ≤ nums[i] ≤ 10^4。
関数
- arg1integer-array
- 戻り値integer
例
- 入力
- arg1 = [2, -4, 3, -1, 5, -6, 1]
- 出力
- 7
- 入力
- arg1 = [-3, -1, -2]
- 出力
- -1
提出時に隠しテスト+12件
ヒント
1つずつ開いてください。開くたびに少しずつ答えに近づきます。
ある位置でちょうど終わる連続区間に注目しましょう。ここで終わる最良の連続区間は、その直前の位置で終わる最良の連続区間とどのように関係していますか?
現在の要素で終わる連続部分列は、その直前で終わった連続部分列を続けるか、この要素から新たに始めるかのどちらかです。前の連続部分列の合計が正の場合にのみ、続けることが有効です。
リストを一度だけ走査し、2つの数値を保持します。現在の要素で終わる連続区間の最大合計と、これまでに見つかった最大合計です。両方を最初の要素に設定するため、負の数だけのリストでも最大の要素が返されます。
この問題の詳しい解説は準備中です。
似た問題
同じ考え方を使う問題です。2〜3問解くとパターンが身につきます。
Python
def maxSubArray(nums):
# ここにコードを書いてくださいケース1
ケース2
入力
arg1 = [2, -4, 3, -1, 5, -6, 1]
期待値
7