数组中的逆序对(剑指offer,面试题51)

题目描述:

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

输入描述:

题目保证输入的数组中没有的相同的数字

数据范围:

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

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

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

解题思路:

归并排序,加逆序计数cntInversePairs = (cntInversePairs%1000000007+(rightEnd-start-mid))%1000000007;注意测试数据量过大,,取模操作((A+B)%C = A%C + B%C);另外需要辅助数组auxiliary,注意递归调用时交替data 与 auxiliary的顺序。

通过的C++代码:

class Solution {
public:
    int InversePairs(vector<int> data) {
        int result = 0;
        int len = data.size();
        if(data.empty() || len < 0)
        {
            return result;
        }
        vector<int> auxiliary(len);
        for(int i=0; i<len; ++i)
        {
            auxiliary[i] = data[i];
        }
        result = calInversePairs(data,auxiliary,0,len-1)%1000000007;
        //delete[] auxiliary;
        return result;
    }
    int calInversePairs(vector<int>& data, vector<int>& aux, int start,int end)
    {
        if(start == end)
        {
            aux[start] = data[start];
            return 0;
        }
        int mid = (end-start) /2;
        int leftInversePairs = calInversePairs(aux,data,start,start+mid)%1000000007;
        int rightInversePairs = calInversePairs(aux,data,start+mid+1,end)%1000000007;
        int leftEnd = start+mid;
        int rightEnd = end;
        int cntInversePairs = 0;
        int auxFlag = end;
        while(leftEnd >= start && rightEnd > start+mid)
        {
            if(data[leftEnd] > data[rightEnd])
            {
                aux[auxFlag--] = data[leftEnd--];
                cntInversePairs = (cntInversePairs%1000000007+(rightEnd-start-mid))%1000000007;
            }
            else
            {
                aux[auxFlag--] = data[rightEnd--];
            }
        }
        while(leftEnd >= start)
        {
            aux[auxFlag--] = data[leftEnd];
            leftEnd--;
        }
        while(rightEnd > start+mid)
        {
            aux[auxFlag--] = data[rightEnd];
            rightEnd--;
        }
        return (cntInversePairs %1000000007+ leftInversePairs + rightInversePairs)%1000000007;
    }
};

猜你喜欢

转载自blog.csdn.net/Victory_tc/article/details/88229816