データ構造とアルゴリズム: K 回の否定後の配列の合計を最大化する

データ構造とアルゴリズム: K 回の否定後の配列の合計を最大化する

[[435915]]

K回の反転後の配列の最大合計

LeetCode の問題へのリンク: https://leetcode-cn.com/problems/maximize-sum-of-array-after-k-negations/

整数の配列 A が与えられた場合、配列を変更する方法は次のとおりです。インデックス i を選択し、A[i] を -A[i] に置き換え、このプロセスを合計 K 回繰り返します。 (同じインデックス i を複数回選択できます。)

このように配列を変更すると、配列の最大可能合計が返されます。

例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.長さ <= 10000
  • 1 <= K <= 10000
  • -100 <= A[i] <= 100

アイデア

この質問のアイデアは、実は非常に簡単に考えることができます。配列の合計を最大化するにはどうすればよいでしょうか?

貪欲な思考、局所最適性: 絶対値の大きい負の数を正の数に変換し、現在の値を最大化します。全体的な最適性: 配列全体の合計が最大に達します。

局所最適は全体最適につながる可能性があります。

したがって、すべての負の数を正の数に変換しても、K は依然として 0 より大きくなります。このときの問題は、正の整数の順序付けられたシーケンスであることです。正の数と負の数を K 回変換して、配列の合計を最大化する方法。

次に、別の貪欲なソリューションがあります。ローカル最適ソリューション: 反転する最小の正の整数のみを見つけて、現在の値が最大値に達するようにします (たとえば、正の整数配列 {5, 3, 1} では、1 を反転して -1 を取得することは、5 を反転して -5 を取得するよりもはるかに大きくなります)。グローバル最適ソリューション: 配列全体の合計が最大値に達します。

この問題を解くときに貪欲アルゴリズムについて考えないかもしれませんが、AC を 1 回で取得できます。

私は、見落とされがちな貪欲な考え方についてお見せするためにここにいます。このような単純な質問に対して、私は貪欲という言葉を 2 回も使いました。

この問題を解決するための手順は次のとおりです。

  • ステップ 1: 絶対値に従って配列を最大から最小の順に並べ替えます。順序は絶対値に基づく必要があることに注意してください。
  • ステップ2: 前から後ろへ移動し、負の数に遭遇したら正の数に変換し、K--
  • ステップ3: Kがまだ0より大きい場合は、Kが使い果たされるまで、最小値を持つ要素を繰り返し変換します。
  • ステップ4: 合計

対応する C++ コードは次のとおりです。

  1. クラスソリューション{
  2. 静的ブールcmp( int a, int b) {
  3. 戻る 絶対値(a) >絶対値(b)
  4. }
  5. 公共
  6. int largestSumAfterKNegations(ベクトル< int >& A, int K) {
  7. sort( A.begin (), A.end ( ), cmp); // 最初のステップ
  8. for ( int i = 0; i < A.size ( ); i++) { // ステップ2
  9. もし (A[i] < 0 && K > 0) {
  10. A[i] * = -1;
  11. K --;  
  12. }
  13. }
  14. if (K % 2 == 1) A[ A.size () - 1] *= -1; // ステップ3
  15. int結果 = 0;
  16. for ( int a : A) result += a; // ステップ4
  17. 結果を返します
  18. }
  19. };

要約する

貪欲問題が単純化されると、人々は疑問を抱き始めます。「これはこのように行われるべきではないのか?これもアルゴリズムなのか?これは貪欲ではないと思う。」

この問題は実は非常に単純で、貪欲アルゴリズムを知らない人でも解くことができますが、ここでは貪欲アプローチを使用して全体を通して説明します。

欲深い考えは必ず存在するからです!

貪欲な考え方(局所最適、大域最適)を持っていない場合、単純な貪欲な質問を感情に基づいて行い、難しい貪欲な質問をまったく解けないという罠に陥りやすくなります。実際、これでは貪欲な考え方を訓練することはできません。

したがって、たとえそれが貪欲な単純な質問だとわかっていても、それを解くには貪欲な思考に頼らなければなりません。これは問題解決の感覚を養うのに非常に役立ちます。

その他の言語

ジャワ

  1. クラスソリューション{
  2. 公共  int largestSumAfterKNegations( int [] nums, int K) {
  3. // 配列を絶対値に従って最大から最小の順に並べ替えます。順序は絶対値に基づく必要があることに注意してください。
  4. nums = IntStream.of (nums )です。
  5. .ボックス化()
  6. .sorted((o1, o2) -> Math.abs (o2) - Math.abs ( o1))
  7. .mapToInt(整数:: intValue ).toArray();
  8. int len ​​= nums.length;
  9. ( int i = 0; i < len; i++)の場合{
  10. //前から後ろへ走査し、負の数が見つかったら正の数に変換します。同時に、K --  
  11. (数値[i] < 0 && K > 0)の場合{
  12. 数値[i] = -数値[i];
  13. K --;  
  14. }
  15. }
  16. // K がまだ 0 より大きい場合は、K が使い果たされるまで、最小値を持つ要素を繰り返し変換します。
  17.  
  18. K % 2 == 1の場合、nums[len - 1] = -nums[len - 1];
  19. Arrays.stream(nums).sum ( )を返します
  20.  
  21. }
  22. }
  1. クラスソリューション{
  2. 公共  int largestSumAfterKNegations( int [] A, int K) {
  3. A.length == 1の場合、 k % 2 == 0 ? A[0] : -A[0]を返します
  4. 配列.sort(A);
  5. 整数 合計= 0;
  6. 整数idx = 0;
  7. ( int i = 0; i < K; i++)の場合{
  8. (i < A.length - 1 && A[idx] < 0)の場合{
  9. A[idx] = -A[idx];
  10. A[idx] >= Math.abs (A[idx + 1]) の場合、idx++;
  11. 続く;
  12. }
  13. A[idx] = -A[idx];
  14. }
  15.  
  16. ( int i = 0; i < A.length; i++) {
  17. 合計+= A[i];
  18. }
  19. 戻る 合計;
  20. }
  21. }

パイソン

  1. クラスソリューション:
  2. def largestSumAfterKNegations(self, A: List[ int ], K: int ) -> int :
  3. A = sorted(A, key = abs , reverse= True ) # A を絶対値で大きい順に並べ替える
  4. iが範囲(len(A))内にある場合:
  5. K > 0かつA[i] < 0の場合:
  6. A[i] *= -1
  7. 1 です
  8. K > 0の場合:
  9. A[-1] *= (-1)**K #Aの最後の数字を取得するには、-1と書くだけです
  10. 戻る 合計(A)

行く

  1. 関数 largestSumAfterKNegations(nums [] int , K int ) int {
  2. sort.Slice(nums, func(i, j int ) bool {
  3. 戻り値math.Abs​​ ( float64(nums[i])) > math.Abs​​ ( float64(nums[j]))
  4. })
  5.  
  6. i := 0; i < len(nums); i++ {
  7. K > 0 && nums[i] < 0 の場合 {
  8. 数値[i] = -数値[i]
  9. K --  
  10. }
  11. }
  12.  
  13. K%2 == 1 の場合 {
  14. nums[len(nums)-1] = -nums[len(nums)-1]
  15. }
  16.  
  17. 結果:= 0
  18. i := 0; i < len(nums); i++ {
  19. 結果 += 数値[i]
  20. }
  21. 結果を返す
  22. }

ジャバスクリプト

  1. var largestSumAfterKNegations =関数(nums, k) {
  2. nums.sort((a, b) => {
  3. Math.abs (b) - Math.abs ( a )を返す
  4. })
  5. ( i = 0 とします; i < nums.length; i++) {
  6. 数値[i] < 0 && k > 0 の場合
  7. 数値[i] *= -1
  8. か --  
  9. }
  10. }
  11.  
  12. k > 0 && k % 2 === 1 の場合
  13. 数値[数値.長さ - 1] *= -1
  14. }
  15. 0 = 0 です
  16.  
  17. nums.reduce((a, b) => {を返す
  18. a + bを返す
  19. })
  20. };

<<:  APPは顔認識を強制しますか?アカウントをキャンセルできませんか?国は行動を起こしている

>>:  2 つの小型モデルで大型モデルに勝つことができます。北京大学卒業生、Google 中国版第一著者「モデルコレクション」、CNN や Transformer にも応用可能!

ブログ    
ブログ    
ブログ    
ブログ    

推薦する

待望のAI実装はどこで行き詰まっているのでしょうか?

AIはこれまで3つの発展の波を経験してきました。最初の2つの波は当時の技術環境やその他の理由により...

ハギングフェイスCEOが2024年のAI業界の6つの大きな変化を予測!

2024年にAI業界はどのように進化するのでしょうか? OpenAIのグレッグ・ブロックマン会長は...

年末総括: 2021 年の人工知能 (AI) と機械学習 (ML) の 5 つの主要な開発トレンド

[[359772]]来年、AI テクノロジーはビジネス業務にさらに深く浸透するでしょう。人工知能 (...

Baidu が AI ホームシアターのソフトウェアとハ​​ードウェアを統合したエコシステムを発表

2月28日、BaiduはXiaodu新製品戦略発表会で、Xiaodu TV CompanionとXi...

...

...

Belcorp CIO: AI による IT 研究開発の見直し

多国籍美容企業ベルコープは過去3年間、パンデミック、消費者行動の変化、サプライチェーンの混乱、インフ...

TensorFlow と PyTorch: ディープラーニングに最適なフレームワークはどれですか?

この記事を読んでいるということは、おそらくすでにディープラーニングの旅を始めているということでしょう...

人工知能はこれら12の分野に混乱をもたらし、ホワイトカラー労働者も職を失うことになるだろう

[[192649]]人工知能 (AI) は、今日最もエキサイティングで将来有望な最先端技術の 1 つ...

高品質な人工知能メンタルヘルスカウンセリングアプリを開発するには?

生活の質は向上している一方で、人々の精神状態は悪化しています。 [[317751]]群衆の中にうつ病...

トラックに「透明マント」を装着し、自動運転車を衝突させる。これは誰がより早く攻撃できるかを競う競争だ

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...

視覚的な「脳の読み取り」:脳の活動から見える世界を再構築する

人間の知覚は客観的な刺激だけでなく過去の経験によっても形成され、それらが組み合わさって脳内で複雑な活...

産業用ロボットの急速な発展は社会にどのような影響を与えるのでしょうか?

インテリジェントインダストリー4.0の急速な発展に伴い、ますます多くの業界でロボットが手作業に代わる...

【他者から学ぶ】360 多面的関心の想起マインド実践的最適化

1. 事業背景ショートビデオや情報ストリームなどのシナリオの増加に伴い、ユーザーはこれらのシナリオで...

...