1186【leetcode】。1つの欠失を持つ最大のサブアレイ和

次のように内容は次のとおりです。

整数の配列を考えると、最大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

 

おすすめ

転載: www.cnblogs.com/seyjs/p/11511403.html