【剑指OFFER】数组中的逆序对(归并排序)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/a342500329a/article/details/100976480

题目描述
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007
输入描述:
题目保证输入的数组中没有的相同的数字

数据范围:

对于%50的数据,size<=10^4

对于%75的数据,size<=10^5

对于%100的数据,size<=2*10^5

示例1
输入
复制
1,2,3,4,5,6,7,0
输出
复制
7
先写一个归并排序熟悉一下:

void  mymerge(int a[],int l,int mid ,int r){
    int * tmp =new int[r-l+1];
    int i=0,t1=l,t2=mid+1;
    while(t1<=mid&&t2<=r){
        if(a[t1]<a[t2]){
            tmp[i++]=a[t1++];
        }else{
            tmp[i++]=a[t2++];
            cnt+=mid-l+1;
        }
        tmp[i++]=a[t1]<a[t2]?a[t1++]:a[t2++];
    }
    while(t1<=mid){
        tmp[i++] = a[t1++];
    }
    while(t2<=r){
        tmp[i++]=a[t2++];
    }
    for(int j=0;j<i;j++){
        a[j+l]=tmp[j];
    }
}

void  mergesort(int a[],int l,int r){
    if(l==r)return ;
    int mid = l+((r-l)>>1);
    mergesort(a,l,mid);
    mergesort(a,mid+1,r);
    mymerge(a,l,mid,r);
}


int main()
{
   int a[6]={4,3,2,6,3,1};
   mergesort(a,0,5);
   for(int i=0;i<6;i++){
        printf("%d\n",a[i]);
   }
    return 0;
}

然后在此基础上进行修改即可。

class Solution {
public:
    int cnt=0;
    int InversePairs(vector<int> data) {
        cnt = 0;
        if (data.size()>0)
            mergesort(data, 0, data.size() - 1);
        return cnt;
    }
    void  mymerge(vector<int> &a,int l,int mid ,int r){
        int * tmp =new int[r-l+1];
        int i=0,t1=l,t2=mid+1;
        while(t1<=mid&&t2<=r){
            if(a[t1]<=a[t2]){
                tmp[i++]=a[t1++];
            }else{
               tmp[i++]=a[t2++];
               cnt+=mid-t1+1;  //最核心的代码,右指针+1,后面数组跳过的这个数字小于多少个前面数组剩余的数字,就加多少
               cnt = cnt%1000000007;
            }
        }
        while(t1<=mid){
            tmp[i++] = a[t1++];
        }
        while(t2<=r){
            tmp[i++]=a[t2++];
        }
        for(int j=0;j<i;j++){
            a[j+l]=tmp[j];
        }
    }
 
    void  mergesort(vector<int> &a,int l,int r){
        if(l==r)return ;
        int mid = l+((r-l)>>1);
        mergesort(a,l,mid);
        mergesort(a,mid+1,r);
        mymerge(a,l,mid,r);
    }
};

猜你喜欢

转载自blog.csdn.net/a342500329a/article/details/100976480