次のように内容は次のとおりです。
整数の配列を考えると、最大1つの要素の削除と空でない部分配列(連続する要素)の最大合計を返します。言い換えれば、あなたは、サブアレーを選択して、そこにまだ残って少なくとも一つの要素であり、残りの要素の合計が可能な最大になるように、必要に応じてそれから一つの要素を削除したいです。
部分配列は一つの要素を削除した後、非空であることが必要であることに注意してください。
例1:
入力:ARR = [1、-2,0,3] 出力:4 説明:我々が選択できるので、[1、-2、0、3]及びドロップ-2、従ってサブアレイ[1、0,3]となります最大値。例2:
入力:ARR = [1、-2、-2,3] 出力:3 説明:私達はちょうど[3]を選択し、それが最大の合計です。例3:
入力:ARR = [-1、-1、-1、-1] 出力:-1 説明:最終サブアレイが空である必要があります。あなたは[-1]を選択し、削除することはできません-1それから、
その後、合計は0に等しい作るために、空の部分配列を取得します。
制約:
1 <= arr.length <= 10^5
-10^4 <= arr[i] <= 10^4
:解決アイデアが得ることができ、最大想定サブアレイのARRを削除した後、[I]は、サブアレイ及び[I]があれば、そのような検索xとして、2つの部分に分割されるARRと等価である:I-1 > X> = 0、Y: I + 1 <Y <LEN(ARR)、 その結果、和(ARRの[X:I- 1]) との和(ARR [I + 1: Y]) 最大を得ることができます。それでは、どのようxとyを見つけるのですか?最小値xは、例えば、単にインデックス0から開始し、ARR順次蓄積し、そこに記録されている場合、合計は(ARR [X:I- 1]) :I(0 [ARR和の最大値でありますそして減算することにより最小値は-1])現れ、同様に、Yは、シークの同じ方法です。2つの特殊なケースがあり、そのサブ配列は、私だけの左または右の一部を取った、または全体の配列arrで最大であり、個別に検討する必要があります。
コードは以下の通りであります:
クラスのソリューション(オブジェクト): デフmaximumSum(自己、ARR): "" " :型ARR:リスト[INT] :RTYPE:int型 """ もし LEN(ARR)== 1 : リターンARR [0] のelif LEN(ARR )== 2 : リターン MAX(SUM(ARR)、ARR [0]、ARR [1 ]) 量 = ARR [0] + ARR [1 ] min_left = ARR [0] 左 = [なし、ARR [0] 用 I における範囲(2 :LEN(ARR)) left.append(MAX(量、量- min_left)) min_left = 分(量、min_left) 量 + = ARR [i]は RES =量#1 セットRETは、ARRの和に等しい 量 = ARR [-1] + ARR [-2 ] min_right = ARR [ - 1 ] RES = MAX(左RES、[-1]) #最後の要素削除する場合 RES = MAX(RES、左[LEN(ARR) - 2 - [-1]、左[LEN(ARR)ARR、2] ] + [-1])ARR #は二最後の要素を除去 するための I 中範囲(LEN(ARR) - 3、-1、-1 ): right_val= MAX(量、量- min_right) min_right = 分(量、min_right) 量 + = ARR [i]の 場合、左[I] == なし: RES = MAX(RES、right_val) 他: RES左= MAX(RES、 [i]は、right_val、[I] +左right_val) 戻り RES