数组中的逆序对

原文地址:https://www.jianshu.com/p/38433a114b90

时间限制:2秒 空间限制:32768K

题目描述

在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007。

输入描述:

题目保证输入的数组中没有的相同的数字。
数据范围:
对于%50的数据,size<=10^4
对于%75的数据,size<=10^5
对于%100的数据,size<=2*10^5

输入

1,2,3,4,5,6,7,0

输出

7

我的代码

class Solution {
public:
    int InversePairs(vector<int> data) {
        if(data.size()<2)
            return 0;
        vector<int> data_copy(data.size(),0);//辅助数组
        return InversePairsCore(data,data_copy,0,data.size()-1);
    }
    //归并思想
    int InversePairsCore(vector<int> &arr,vector<int> &arr_,
                        int begin, int end){
        if(begin==end){
            arr_[begin]=arr[begin];
            return 0;
        }
        int len=(end-begin)/2;
        int left=InversePairsCore(arr,arr_,begin,begin+len);
        int right=InversePairsCore(arr,arr_,begin+len+1,end);
        int i=begin+len,j=end,k=end;
        int count=0;
        while((i>=begin)&&(j>begin+len)){
            if(arr[i]>arr[j]){
                arr_[k--]=arr[i--];
                count+=j-begin-len;
                if(count>1000000007)
                    count%=1000000007;
            }
            else
                arr_[k--]=arr[j--];
        }
        while(i>=begin)
            arr_[k--]=arr[i--];
        while(j>begin+len)
            arr_[k--]=arr[j--];
        for(int i=begin;i<=end;i++)
            arr[i]=arr_[i];
        return (left+right+count)%1000000007;
    }
};

运行时间:107ms
占用内存:4444k

原文地址:https://www.cnblogs.com/cherrychenlee/p/10822286.html