一.题目描述
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007
输入描述:
题目保证输入的数组中没有的相同的数字
数据范围:
对于%50的数据,size<=10^4
对于%75的数据,size<=10^5
对于%100的数据,size<=2*10^5
二.代码(C++)
class Solution {
private:
const int tmop = 1000000007;
public:
int InversePairs(vector<int> data) {
int p = 0;
int n = data.size();
if(n<2)
return p;
vector<int> tmp(n);
countInversePairs(data,tmp,0,n-1,p);
return p;
}
void countInversePairs(vector<int> &data, vector<int> &tmp, int l, int r, int &p)
{
if(l==r)
return;
int mid = l+((r-l)/2);
countInversePairs(data,tmp,l,mid,p);
countInversePairs(data,tmp,mid+1,r,p);
merge_(data,tmp,l,mid,r,p);
return;
}
void merge_(vector<int> &data, vector<int> &tmp, int l, int mid, int r, int &p)
{
int i=l,j=mid+1,k=0;
while(i<=mid && j<=r)
{
if(data[i]>data[j])
{
p += (mid-i+1);
p = p%tmop;
tmp[k++] = data[j++];
}
else
tmp[k++] = data[i++];
}
while(i<=mid)
tmp[k++] = data[i++];
while(j<=r)
tmp[k++] =data[j++];
i = l;k = 0;
while(i<=r)
data[i++] = tmp[k++];
}
};
三.提交记录

四.备注
使用归并排序。过程如图
每次合并时,记录符合题目条件的逆序对个数,排序结束,则计数完毕。时间复杂度O(Nlog(N))。
注:若使用暴力遍历,时间复杂度O(N^2),超时。

本文介绍了一种高效算法,用于计算数组中逆序对的总数,并通过C++实现。采用归并排序思想,确保时间复杂度为O(NlogN),适用于大规模数据处理。
267

被折叠的 条评论
为什么被折叠?



