トピック:
整数Aの配列を考えると、我々は次のような方法で、配列を変更することができます。私たちは、インデックスiとAを選択し、[I] -A [i]は、このプロセスは、K回の合計を繰り返しているに置き換えられます。(私たちは、私回以上同じインデックスを選択することができます。)
このように配列を変更した後、可能な最大の配列を返します。
例1:
入力:A = [4,2,3]、K = 1
出力:5
説明:(1)、次いでA [4、2,3]となるインデックスを選択します。
例2:
入力:A = [3、-1,0,2] 、K = 3
出力:6
説明:(1、2、2)インデックスを選択し、Aは、[3,1,0,2]となります。
例3:
入力:A = [2、-3、 -1,5、-4]、K = 2
出力:13
説明:のインデックス(1,4)、およびA [2,3を選択し、-1,5,4 ]。
ヒント:
1 <= A.length <= 10000
1 <= K <= 10000
-100 <= A [i]が<= 100
出典:滞在ボタン(LeetCode)
リンクします。https://leetcode-cn.com/problems/maximize-sum-of-array-after-k-negations
アイデア:
貪欲。数設け所与のアレイは、負フラグであります
フラグの場合は<= K、と私はすべての負の数が正となっているフラグにこの機会を利用したいと思い、K-フラグチャンスの残り、それが偶数であれば、常にすべての数を維持するには正であり、残りK-フラグ機会奇数である場合、次に、全ての正順、最小旋削負になり、最終的な結果は、この時点で最大です。
フラグ> K、大元の配列Aの小さなは、第Kは正の数となり、最終的な結果が取る場合。
コード:
輸入 java.utilの。* ; 輸入いるjava.math *。; / * クラスMysort実装コンパレータ<整数> { @オーバーライド 比較公共INT(整数O1、O2整数){ O1返す - O2を。 } } * / / * 5 6 9 3 -3 K = 2 -2 5 0 2 -2 K = 3 * / クラスソリューション{ 公共 のint largestSumAfterKNegations(INT [] A、INT K){ Arrays.sort(A)。 INTフラグ= 0、和= 0 。 以下のために(INT ; I <A.length; iが0 = I ++ ){ 場合(A [i]が<0)フラグ++ 。 } もし(フラグ<= K){ もし、((K-フラグ)%2 == 0 ){ ため(INT iが= 0; I <A.length; I ++ ){ 和 + = Math.abs(A [I])。 } } 他{ ため(intは ; I <A.length I ++ I = 0 ){ A [i]は = Math.abs(A [I])。 和 + = A [i]は、 } Arrays.sort(A)。 和 - = 2 * Math.abs(A [0 ])。 } } 他{ ため(intは ; I <K I ++ I = 0 ){ 和 + = Math.abs(A [I])。 } 用(intは ; I <A.length I ++ iはKを= {) 和 + = A [i]は、 } } 戻り値の合計。 } } パブリック クラスメイン{ 公共 静的 ボイドメイン(文字列[]引数){ スキャナスキャナ = 新しいスキャナ(System.in)。 ソリューションソリューションは = 新しいソリューション(); INT、N = scanner.nextInt()。 INT []チップ= 新しい INT [N]。 以下のために(INT I 0 =; N I <; Iは++ ){ チップ[I] = scanner.nextInt()。 } INT K = scanner.nextInt()。 System.out.println(solution.largestSumAfterKNegations(チップ、K))。 } }