题解 | #数组中的逆序对# 官方代码+Chat的注释
数组中的逆序对
https://www.nowcoder.com/practice/96bd6684e04a44eb80e6a68efc0ec6c5
#include <bits/types/struct_tm.h>
#include <vector>
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型vector
* @return int整型
*/
int mod = 1000000007;
int mergeSort(int left, int right, vector<int>& data, vector<int>& tmp) {
// 考虑到归并排序的特点,其本身具有递归的特点,也具有阶段性排序的特点。
// 递归属性(类似后序遍历的顺序)
// 1、递归结束判断
// 注意这里一定要是大于等于,因为元素个数是1的情况下就一定是有序的,对于左闭右闭的区间来说相等即为停止条件。
if (left >= right) return 0;
// 2、递归延续逻辑
int mid = (left + right) / 2;
int res = mergeSort(left, mid, data, tmp) + mergeSort(mid + 1, right, data,tmp);
res %= mod;
// 3、本层逻辑处理
// 确定左右区间的起点
int i = left, j = mid + 1;
// 使用 temp 数组暂存当前分段的数据。
for (int k = left; k <= right; k++) {
tmp[k] = data[k];
}
// 归并与计数
for (int k = left; k <= right; k++) {
// 这里检查左子数组是否已经完全复制回主数组 data
if (i == mid + 1) {
data[k] = tmp[j++];
}
// 这一行检查两种情况:一是右子数组是否已经完全复制回 data(即 j 超过了 right),二是左子数组的当前元素是否小于或等于右子数组的当前元素。
else if (j == right + 1 || tmp[i] <= tmp[j]) {
data[k] = tmp[i++];
}
// 这是处理逆序对的关键代码。如果以上条件都不满足,即 temp[i] 大于 temp[j],表明存在逆序对。
else {
data[k] = tmp[j++];
res += mid - i + 1;
}
}
return res % mod;
}
int InversePairs(vector<int>& nums) {
// write code here
int n = nums.size();
// r每次都是先赋值再判断,所以初始值对程序运行没有影响
vector<int> r(n);
return mergeSort(0, n - 1, nums, r);
}
};

查看6道真题和解析