描述
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P mod 1000000007
数据范围: 对于 50%50% 的数据, size\leq 10^4size≤10
4
对于 100%100% 的数据, size\leq 10^5size≤10
5
数组中所有数字的值满足 0 \le val \le 10000000≤val≤1000000
要求:空间复杂度 O(n)O(n),时间复杂度 O(nlogn)O(nlogn)
输入描述:
题目保证输入的数组中没有的相同的数字
示例1
输入:[1,2,3,4,5,6,7,0]
返回值:7
示例2
输入:[1,2,3]
返回值:0
代码
class Solution {
public:
int mod = 1000000007;
int res = 0;
int InversePairs(vector<int> data) {
int len = data.size();
if (len == 0) {
return 0;
}
vector<int> tmp(len, 0);
mergeSort(data, 0, len-1, tmp);
return res;
}
void mergeSort(vector<int> &data, int left, int right, vector<int> &tmp) {
if (left >= right) {
return;
}
int mid = left + (right-left)/2;
mergeSort(data, left, mid, tmp);
mergeSort(data, mid+1, right, tmp);
int i = left, j = mid+1;
for(int k = left; k <= right; k++) {
tmp[k] = data[k];
}
for(int k = left; k <= right; k++) {
if (i == mid+1) {
data[k] = tmp[j++];
} else if (j == right+1 || tmp[i] <= tmp[j]) {
data[k] = tmp[i++];
} else {
data[k] = tmp[j++];
//计算逆序对个数
res += mid - i + 1;
res = res % mod;
}
}
return;
}
};