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

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

输入:数组

输出:逆序对总数

思路:分治

先把数组分成子数组,统计出子数组内部的逆序对数目,然后再统计出两个相邻子数组之间的逆序对数目。还需要对数组进行排序。

基于归并排序写出以下代码:

class Solution {
public:
    long long InversePairsCore(vector<int>& data,vector<int>& copy,int i,int j)
    {
        if(i==j)
        {
            copy[i]=data[i];
            return 0;
        }
        int length=(j-i)/2;
        int left=InversePairsCore(copy,data,i,i+length);
        int right=InversePairsCore(copy,data,i+length+1,j);
        // m is end of left
        int m=i+length;
        // n is end of right
        int n=j;
        int indexCopy=j;
        long long count=0;
        while(m>=i&&n>=i+length+1)
        {
            if(data[m]>data[n])
            {
                copy[indexCopy--]=data[m--];
                count+=n-i-length;
            }
            else
            {
                copy[indexCopy--]=data[n--];
            }
        }
        for(;m>=i;m--)
            copy[indexCopy--]=data[m];
        for(;n>=i+length+1;n--)
            copy[indexCopy--]=data[n];
        return (left+right+count)%1000000007;
    }
    int InversePairs(vector<int>& data) {
        int len=data.size();
        if(len==0)
            return 0;
        vector<int> copy(len);
        for(int i=0;i<len;++i)
            copy[i]=data[i];
        long long count=InversePairsCore(data, copy, 0, len-1);
        return count;
    }
};

复杂度分析:时间复杂度为O(nlogn),空间复杂度为O(n).

发布了115 篇原创文章 · 获赞 14 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_22148493/article/details/105124434