数组中的逆序对

2020-05-14  本文已影响0人  su945

题目描述

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

问题分析

//思路1暴力解决
//思路2利用归并排序
参考:https://www.nowcoder.com/questionTerminal/96bd6684e04a44eb80e6a68efc0ec6c5?f=discussion

解题思路1

class Solution {
public:
    long countInversePairs(vector<int> &data,vector<int> &copy,int start,int end)
    {
        if (start == end)
        {
            copy[start] = data[start];
            return 0;
        }
        //
        int length = (end-start)/2;
        long left = countInversePairs(copy,data,start,start+length);
        long right = countInversePairs(copy,data,start+length+1,end);
        int i = start+length;
        int j = end;
        int indexCopy = end;
        long count = 0;
        while(i >= start && j >= (start+length+1))
        {
            //逆序对出现
            if (data[i] > data[j])
            {
                copy[indexCopy--] = data[i--];
                //统计方式需要分析
                count = count + j - start-length;
            } else
            {
                copy[indexCopy--] = data[j--];
            }
        }

        for( ; i >= start; i--)
        {
            copy[indexCopy--] = data[i];
        }

        for( ; j >= (start+length+1); j--)
        {
            copy[indexCopy--] = data[j];
        }

        return left+right+count ;

    }


    int InversePairs(vector<int> data) {
        if(data.empty())
        {
            return 0;
        }

        //copy 一个同样大小的数组
        vector<int> copy(data);

        long count = countInversePairs(copy,data,0,data.size()-1);
        return count%1000000007;
    }
};
上一篇 下一篇

猜你喜欢

热点阅读