题目描述
数组中的逆序对
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007
输入描述:
题目保证输入的数组中没有的相同的数字
数据范围:
对于%50的数据,size<=10^4
对于%75的数据,size<=10^5
对于%100的数据,size<=2*10^5
示例1
输入
1,2,3,4,5,6,7,0
输出
7
源码
static long long countt=0;
class Solution {
public:
void myMerge(int a[],int l,int m, int r)
{
int *t =new int[r-l+1]();
int p = 0;
int i = l;
int j = m+1;
while(i<=m&&j<=r)
{
if(a[i]<=a[j])
t[p++] = a[i++];
else
{
t[p++] = a[j++];
countt += m-i+1;//左集元素大于右集元素时,发现一组逆序,计数加1.
}
}
while(i<= m) t[p++] = a[i++];
while(j<= r) t[p++] = a[j++];
for(int i=0;i<p;i++)
{
a[l+i] = t[i];
}
delete []t;
}
void myMergeSort(int a[],int l,int r)
{
if(l<r)
{
int m = (l+r)/2;
myMergeSort(a,l,m);
myMergeSort(a,m+1,r);
myMerge(a,l,m,r);
}
}
int InversePairs(vector<int> data) {
int n = data.size();
int *pdata = new int[n]();
for(int i = 0;i<n;i++) pdata[i] = data[i];
myMergeSort(pdata,0,n-1);
delete []pdata;
return countt%1000000007;
}
};
本文详细解析了剑指Offer第35题——数组中的逆序对的求解方法。通过归并排序算法优化,实现了高效计算逆序对总数的功能,并将结果对1000000007取模。代码示例清晰,适用于不同规模的数据输入。

401

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



