C ++中的反向对

假设我们有一个数组,在这个数组中,如果满足以下条件,我们将说一对(A [i]和A [j])为重要的反向对-

  • 如果i <j并且A [i]> 2 * nums [j]

我们必须找到重要反向对的数量。因此,如果输入类似于[2,8,7,7,2],则结果将为3。

为了解决这个问题,我们将遵循以下步骤-

  • 回答:= 0

  • 定义一个函数merge(),将采用一个数组,低,中,高,

  • k:=高-低+ 1

  • 定义大小为k的数组温度

  • i:=低,j =中+ 1,k:= 0

  • 第一:=中+ 1

  • 当我<=中时,做-

    • temp [k]:= a [j]

    • (将j增加1)

    • (将k增加1)

    • (先增加1)

    • 而first <=高且a [first] * 2 <a,则执行-

    • 而(j <=高且a [j] <= a [i]),则-

    • 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:=低,当i <=高时,更新(将i增加1),请执行-

      • a [i]:= temp [k]

      • (将k增加1)

    • 定义一个函数calc(),将采用一个数组,低,高,

    • 如果低> =高,则-

      • 返回

    • 中:=低+(高-低)/ 2

    • 调用函数calc(a,low,mid)

    • 调用函数calc(a,mid + 1,high)

    • 调用函数merge(a,low,mid,high)

    • 定义一个函数solve(),它将采用数组A,

    • 回答:= 0

    • n:= A的大小

    • 调用函数calc(A,0,n-1)

    • 返回ans

    • 在主要方法中,执行以下操作

    • 返回调用函数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