C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++でシーケンスを増やすための最小スワップ


同じ長さのゼロ以外の2つの整数シーケンスAとBがあるとします。要素A[i]とB[i]を交換できます。両方の要素がそれぞれのシーケンスで同じインデックス位置にあることに注意する必要があります。いくつかのスワップを完了した後、AとBは両方とも厳密に増加しています。両方のシーケンスを厳密に増やすには、スワップの最小数を見つける必要があります。

したがって、入力がA=[1,3,5,4]およびB=[1,2,3,7]の場合、A[3]をB[3]と交換すると、答えは1になります。その場合、シーケンスはA=[1,3,5,7]およびB=[1,2,3,4]になり、どちらも厳密に増加します。

これを解決するには、次の手順に従います-

  • n:=A配列のサイズ、それぞれサイズnの2つの配列swapCntとnoSwapCntを作成します

  • swapCntに1を挿入し、noSwapCntに0を挿入します

  • 1からn–1の範囲のiの場合

    • swapCnt [i]:=nおよびnoSwapCnt:=n

    • A [i]> A [i –1]かつB[i]> B [i – 1]の場合、

      • noSwapCnt [i]:=noSwapCnt [i – 1]

      • swapCnt [i]:=swapCnt [i – 1] + 1

    • A [i]> B [i –1]およびB[i]> A [i – 1]の場合、

      • swapCnt [i]:=最小のswapCnt [i]、1 + noSwapCnt [i – 1]

      • noSwapCnt [i]:=最小のswapCnt [i – 1]、noSwapCnt [i]

  • swapCnt [n – 1]、noSwapCnt [n – 1]

    の最小値を返します

例(C ++)

理解を深めるために、次の実装を見てみましょう-

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   int minSwap(vector<int>& A, vector<int>& B) {
      int n = A.size();
      vector <int> swapCnt(n), noSwapCnt(n);
      swapCnt[0] = 1;
      noSwapCnt[0] = 0;
      for(int i = 1; i < n; i++){
         swapCnt[i] = n;
         noSwapCnt[i] = n;
         if(A[i] > A[i - 1] && B[i] > B[i - 1]){
            noSwapCnt[i] = noSwapCnt[i - 1];
            swapCnt[i] = swapCnt[i - 1] + 1;
         }
         if(A[i] > B[i - 1] && B[i] > A[i - 1]){
            swapCnt[i] = min(swapCnt[i], 1 + noSwapCnt[i - 1]);
            noSwapCnt[i] = min(swapCnt[i - 1], noSwapCnt[i]);
         }
      }
      return min(swapCnt[n - 1], noSwapCnt[n - 1]);
   }
};
main(){
   vector<int> v1 = {1,3,5,4};
   vector<int> v2 = {1,2,3,7};
   Solution ob;
   cout << (ob.minSwap(v1, v2));
}

入力

[1,3,5,4]
[1,2,3,7]

出力

1

  1. C++で文字列回文を作成するための削除の最小数。

    問題の説明 サイズ「n」の文字列が与えられます。タスクは、文字列回文を作成するために最小数の文字を削除することです。 指定された文字列が「abcda」の場合、最初と最後を除く任意の2文字を削除して、回文にすることができます。 文字「b」と「c」を削除すると、「ada」文字列は回文になります 文字「c」と「d」を削除すると、「aba」文字列は回文になります 文字「b」と「d」を削除すると、「aca」文字列は回文になります アルゴリズム 1. Find longest palindromic subsequence of given string. Let’s

  2. C++で互いに素な配列を作成するための最小限の挿入

    このセクションでは、別の興味深い問題が発生します。 N個の要素の配列があるとします。この配列を互いに素な配列にするためには、交点の最小数を見つける必要があります。互いに素な配列では、2つの連続する要素ごとのgcdは1です。配列も印刷する必要があります。 {5、10、20}のような要素があるとします。これは互いに素な配列ではありません。ここで、5、10、10、20の間に1を挿入すると、互いに素な配列になります。したがって、配列は{5、1、10、1、20}のようになります。 アルゴリズム makeCoPrime(arr, n): begin    count := 0 &nb