[数组]数组中的逆序对

125 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

问题

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

思路

归并排序的合并阶段统计逆序数。

代码实现

class Solution {
public:
    int mod = 1000000007;
    int mergeSort(int left, int right, vector<int>& data, vector<int>& temp)
    {
        if (left >= right) return 0;
        // 中间索引
        int mid = left + (right - left) / 2;
        // 划分成一个个节点之后,再合并
        int res  = mergeSort(left, mid, data, temp) + mergeSort(mid + 1, right, data, temp);
        // 防止溢出
        res %= mod;
        // 指向两段数据的起始位置
        int i = left, j = mid + 1;
        // 拷贝数组,temp 存储两端数据 
        for (int k = left; k <= right; k++)
        {
            temp[k] = data[k];
        }
        
        // 比较左右两段数据,并将数据填入原始数据中
        for (int k = left; k <= right; k++)
        {
            // 左边数据填完,将剩余右边数据填充到原始数组
            if (i ==  mid + 1)
                data[k] = temp[j++];
            //  右边数据填充完||左边数据小于右边数据
            else if (j == right + 1 || temp[i] <= temp[j])
                data[k] = temp[i++];
            // 左边数据大于右边数据
            else if (temp[i] > temp[j])
            {
                data[k] = temp[j++];
                // 左边长度 - 索引位置
                res += mid - i + 1;
            }
        }
        return res % mod; 
    }
    int InversePairs(vector<int> data) {
        int n = data.size();
        vector<int> res(n);
        return mergeSort(0, n - 1, data, res);
    }
};