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

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

1.暴力解法 两个for循环,时间复杂度为n^2不满足要求

2.考虑在归并排序过程中 ,左右两段合并时,只要左边的第i 个数大于右边的第j 个数,则,左边剩下的数也大于第j个数。代码很简单,原理可以参考LeetCode上面的视频讲解。

class Solution {
public:
   
    int InversePairs(vector<int> data) {
        int ret=0;
        MergeSort(data,0,data.size()-1,ret);
        return ret;
    }
    void MergeSort(vector<int>&array,int left,int right,int &ret)
    {
        if(left>=right)
            return;
        int mid = left + ((right - left) >> 1);
        MergeSort(array,left,mid,ret);
        MergeSort(array,mid+1,right,ret);
        merge(array,left,mid,right,ret);
    }
    void merge(vector<int>&array,int left,int mid,int right,int &ret)
    {
        int k =0,i = left,j = mid+1;
        vector<int>temp(right-left+1);
        while(i<=mid && j<=right)
        {
            if(array[i]<=array[j])
                temp[k++]=array[i++];
            else
            {
                temp[k++]=array[j++];
                 ret = (ret + (mid-i+1))%1000000007;
            }
        }
        while(i<=mid)
            temp[k++] = array[i++];
        while(j<=right)
            temp[k++] = array[j++];
        for (k = 0, i = left; i <= right; ++i, ++k) 
            array[i] = temp[k];
    }
};

你可能感兴趣的:(c++,code)