版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
题目描述
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数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
先写一个归并排序熟悉一下:
void mymerge(int a[],int l,int mid ,int r){
int * tmp =new int[r-l+1];
int i=0,t1=l,t2=mid+1;
while(t1<=mid&&t2<=r){
if(a[t1]<a[t2]){
tmp[i++]=a[t1++];
}else{
tmp[i++]=a[t2++];
cnt+=mid-l+1;
}
tmp[i++]=a[t1]<a[t2]?a[t1++]:a[t2++];
}
while(t1<=mid){
tmp[i++] = a[t1++];
}
while(t2<=r){
tmp[i++]=a[t2++];
}
for(int j=0;j<i;j++){
a[j+l]=tmp[j];
}
}
void mergesort(int a[],int l,int r){
if(l==r)return ;
int mid = l+((r-l)>>1);
mergesort(a,l,mid);
mergesort(a,mid+1,r);
mymerge(a,l,mid,r);
}
int main()
{
int a[6]={4,3,2,6,3,1};
mergesort(a,0,5);
for(int i=0;i<6;i++){
printf("%d\n",a[i]);
}
return 0;
}
然后在此基础上进行修改即可。
class Solution {
public:
int cnt=0;
int InversePairs(vector<int> data) {
cnt = 0;
if (data.size()>0)
mergesort(data, 0, data.size() - 1);
return cnt;
}
void mymerge(vector<int> &a,int l,int mid ,int r){
int * tmp =new int[r-l+1];
int i=0,t1=l,t2=mid+1;
while(t1<=mid&&t2<=r){
if(a[t1]<=a[t2]){
tmp[i++]=a[t1++];
}else{
tmp[i++]=a[t2++];
cnt+=mid-t1+1; //最核心的代码,右指针+1,后面数组跳过的这个数字小于多少个前面数组剩余的数字,就加多少
cnt = cnt%1000000007;
}
}
while(t1<=mid){
tmp[i++] = a[t1++];
}
while(t2<=r){
tmp[i++]=a[t2++];
}
for(int j=0;j<i;j++){
a[j+l]=tmp[j];
}
}
void mergesort(vector<int> &a,int l,int r){
if(l==r)return ;
int mid = l+((r-l)>>1);
mergesort(a,l,mid);
mergesort(a,mid+1,r);
mymerge(a,l,mid,r);
}
};