本文已参与「新人创作礼」活动,一起开启掘金创作之路。
问题
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数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);
}
};