問題の説明:
整数配列を入力してください。配列には正と負の数があります。配列内の1つ以上の連続した整数がサブ配列を形成します。すべてのサブ配列の合計の最大値を見つけます。
必要な時間の複雑さはO(n)です。
例1:
输入: nums = [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
問題分析:
この問題は、動的プログラミングを使用して解決できます。動的計画法は、表を埋める方法と考えることもでき、動的計画表を作成する必要があります。ここでテーブルが作成され、テーブルの各位置の要素値は、現在の位置がサブ配列の最後の位置である場合の最大値を示します。具体的なアプローチは次のとおりです。
- 初期化:変数maxvレコードサブ配列の最大合計を定義します。初期値はリストlist [0]の最初の要素です。
- リストをトラバースするには、前の要素の値が負の場合、現在の要素の値は変更されません。正の場合、前の要素の値を現在の要素の値として追加します。
- 現在の要素の値をmaxvと比較すると、maxvのほうが大きい値をとります
例としてリストnums = [-2,1、-3,4、-1,2,1、-5,4]を取り上げます。
nums | -2 | 1 | -3 | 4 | -1 | 2 | 1 | -5 | 4 |
dp | -2 | 1 | -2 | 4 | 3 | 5 | 6 | 1 | 5 |
maxv | -2 | 1 | 1 | 4 | 4 | 5 | 6 | 6 | 6 |
アルゴリズムの分析:
アルゴリズムはnums配列を1回だけトラバースする必要があるため、時間の複雑さはO(n)です。一定量の追加スペースを使用すると、スペースの複雑度はO(1)になります。
コーディングの実装:
class Solution:
def maxSubArray(self, lists: List[int]) -> int:
maxv = lists[0]
for i in range(1,len(lists)):
if lists[i-1]>0:
lists[i] += lists[i-1]
if lists[i] > maxv:
maxv = lists[i]
return maxv
再アップロードとキャンセルに失敗しました