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

C++のK逆ペア配列


2つの整数nとkがあるとすると、正確にk個の逆数のペアが存在するように、1からnまでの数で構成される異なる配列の数を見つける必要があります。逆ペアは、配列のi番目とj番目の要素用であり、i a [j]の場合、逆ペアと呼ばれます。ここで、答えは非常に大きくなる可能性があります。答えは$ 10 ^ {9} $+7を法とする必要があります。

したがって、入力がn=3およびk=1の場合、配列[1,3,2]および[2,1,3]には1つの逆ペアしかないため、出力は2になります。

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

  • サイズ(n + 1)x(k + 1)の2D配列dpを1つ定義します
  • dp [0、0]:=1
  • iを初期化する場合:=1、i <=nの場合、更新(iを1つ増やす)、実行-
    • dp [i、0]:=1
    • jを初期化する場合:=1、j <=kの場合、更新(jを1つ増やす)、実行-
      • dp [i、j]:=dp [i、j-1] + dp [i – 1、j]
      • dp [i、j]:=dp [i、j] mod m
      • j> =iの場合、-
        • dp [i、j]:=(dp [i、j] --dp [i – 1、j --i] + m)mod m
  • return dp [n、k]

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

#include <bits/stdc++.h>
using namespace std;
const int m = 1e9 + 7;
class Solution {
public:
   int kInversePairs(int n, int k) {
      vector < vector <int> > dp(n + 1, vector <int>(k + 1));
      dp[0][0] = 1;
      for(int i = 1; i <= n; i++){
         dp[i][0] = 1;
         for(int j = 1; j <= k; j++){
            dp[i][j] = dp[i][j - 1] + dp[i - 1][j];
            dp[i][j] %= m;
            if(j >= i){
               dp[i][j] = (dp[i][j] - dp[i - 1][j - i] + m) % m;
            }
         }
      }
      return dp[n][k];
   }
};
main(){
   Solution ob;
   cout << (ob.kInversePairs(4,2));
}

入力

4
2

出力

5

  1. 文字列のC++配列

    このセクションでは、C++で文字列の配列を定義する方法を説明します。私たちが知っているように、Cには文字列がありませんでした。文字配列を使用して文字列を作成する必要があります。したがって、文字列の配列を作成するには、文字の2次元配列を作成する必要があります。各行は、その行列に異なる文字列を保持しています。 C ++には、stringというクラスがあります。このクラスオブジェクトを使用すると、文字列型データを格納し、それらを非常に効率的に使用できます。オブジェクトの配列を作成できるので、文字列の配列を簡単に作成できます。 その後、文字列型のベクトルオブジェクトを作成し、それらを配列として使用

  2. C++での並べ替え

    このセクションでは、C++で並べ替えアルゴリズムを実行する方法を説明します。並べ替えられた配列は、各要素が数値、アルファベット順などの順序で並べ替えられた配列です。バブルソート、挿入ソート、選択ソート、マージソート、クイックソート、ヒープソートなど、数値配列をソートするための多くのアルゴリズムがあります。選択ソートを使用した配列のソートの詳細については、以下を参照してください。 選択ソートは、ソートされた配列を生成するソート方法です。これは、配列内の最小の要素を繰り返し見つけて、ソートされていない部分の先頭にある要素と交換することによって行われます。 選択ソートを使用してソートされた配列を