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

C++でのリバースペア


配列があると仮定します。この配列では、次の条件を満たす場合、1つのペア(A[i]とA[j])を重要な逆ペアと呼びます-

  • if i 2 * nums [j]

重要なリバースペアの数を見つける必要があります。したがって、入力が[2,8,7,7,2]の場合、結果は3になります。

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

  • ans:=0
  • 関数merge()を定義します。これにより、配列a、low、mid、highが取得されます。
  • k:=高-低+ 1
  • サイズkのアレイ温度を定義します
  • i:=低、j =中+1、k:=0
  • 最初:=半ば+ 1
  • i <=midの間、-
      を実行します
    • 最初の<=が高く、a[最初の]* 2 を実行します。
    • (最初に1ずつ増やします)
  • while(j <=high and a [j] <=a [i])、do −
    • temp [k]:=a [j]
    • (jを1増やします)
    • (kを1増やします)
  • ans:=ans + first-(mid + 1)
  • temp [k]:=a [i]
  • (iを1増やします)
  • (kを1増やします)
  • j <=高い間、-
      を実行します
    • temp [k]:=a [j]
    • (kを1増やします)
    • (jを1増やします)
  • k:=0
  • iを初期化する場合:=low、i <=highの場合、更新(iを1つ増やす)、実行-
    • a [i]:=temp [k]
    • (kを1増やします)
  • 関数calc()を定義します。これにより、配列a、low、highが取得されます
  • 低>=高の場合、-
    • 戻る
  • 中:=低+(高-低)/ 2
  • 関数calc(a、low、mid)を呼び出します
  • 関数calc(a、mid + 1、high)を呼び出します
  • 関数merge(a、low、mid、high)を呼び出します
  • 関数solve()を定義します。これには、配列Aが必要です。
  • ans:=0
  • n:=Aのサイズ
  • 関数calc(A、0、n-1)を呼び出します
  • 回答を返す
  • メインの方法から、次の手順を実行します
  • 関数solve(nums)の呼び出しを返す
  • 理解を深めるために、次の実装を見てみましょう-

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long int lli;
    class Solution {
    public:
       int ans = 0;
       void merge(vector <int> &a, lli low, lli mid, lli high){
          lli k = high - low + 1;
          vector <lli> temp(k);
          lli i = low, j = mid + 1;
          k = 0;
          lli first = mid + 1;
          while(i <= mid){
             while(first <= high && (lli)a[first] * 2 < (lli)a[i]) {
                first++;
             }
             while(j <= high && a[j] <= a[i])
             {
                temp[k] = a[j];
                j++;
                k++;
             }
             ans += first - (mid + 1);
             temp[k] = a[i];
             i++;
             k++;
          }
          while(j <= high){
             temp[k] = a[j];
             k++;
             j++;
          }
          k = 0;
          for(lli i = low; i <= high; i++){
             a[i] = temp[k];
             k++;
          }
       }
       void calc(vector <int> &a, lli low, lli high){
          if(low >= high)return;
          lli mid = low + (high - low)/2;
          calc(a, low, mid);
          calc(a, mid + 1, high);
          merge(a, low, mid, high);
       }
       lli solve(vector<int> &A) {
          ans = 0;
          lli n = A.size();
          calc(A, 0, n - 1);
          return ans;
       }
       int reversePairs(vector<int>& nums) {
          return solve(nums);
       }
    };
    main(){
       Solution ob;
       vector<int> v = {2,8,7,7,2};
       cout << (ob.reversePairs(v));
    }

    入力

    {2,8,7,7,2}

    出力

    3

    1. C++STLのリスト逆関数

      この記事では、C++でのlist::reverse()関数の動作、構文、および例について説明します。 STLのリストとは リストは、任意の場所で一定時間の挿入と削除を順番に実行できるデータ構造です。リストは、二重にリンクされたリストとして実装されます。リストを使用すると、連続しないメモリ割り当てが可能になります。リストは、配列、ベクトル、および両端キューよりも、コンテナー内の任意の位置で要素の挿入抽出と移動を実行します。リストでは、要素への直接アクセスは遅く、リストはforward_listに似ていますが、フォワードリストオブジェクトは単一のリンクリストであり、フォワードでのみ繰り返すことが

    2. C++のリバースビット

      符号なし数値xが1つあり、その2進表現(32ビット符号なし整数)を簡単に見つけることができるとします。私たちの仕事はビットを逆にすることです。したがって、バイナリ表現が00000000000000000000001001110100のような場合、反転されたビットは00101110010000000000000000000000になります。したがって、ビットを反転した後に実際の数値を返す必要があります これを解決するには、次の手順に従います- nが指定された数であると仮定します 答えましょう:=0 for i:=31から0: answer:=Answer OR(n AND i)、そして