题目描述
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007
1,2,3,4,5,6,7,0
7
归并排序,可以从大到小排,
主框架递归,注意,left < right
可在外面将数组申请好。
提高速度,可以用 copy 函数。
计数用 long long ,取余后仍可用 int
但,代码还是用了125ms,和前面的差好多。。。
reference: https://www.zybuluo.com/zimenglan/note/64971
class Solution {
public:
int InversePairs(vector<int> data) {
if (data.size()==0)return 0;
int size = data.size();
vector<int>tmp(size);
return inverspair(data,tmp,0,size-1);
}
int mymerge(vector<int>&data,vector<int>&tmp,int left,int right)
{
// vector<int>tmp(right-left+1);
int mid = (left+right)/2;
int i = left; int j = mid+1; int k = left;
long long cnt = 0;
while(i<=mid && j<=right)
{
if (data[i]>data[j])
{
cnt += (right-j+1);
tmp[k++] = data[i++];
}
else
{
tmp[k++] = data[j++];
}
}
while(i<=mid)
{
tmp[k++] = data[i++];
}
while (j<=right)
{
tmp[k++] = data[j++];
}
//for (int t = left;t<=right;t++)
// {
// data[t] = tmp[t];
// }
copy(tmp.begin()+left,tmp.begin()+right+1,data.begin()+left);
return cnt % 1000000007 ;
}
int inverspair(vector<int>&data,vector<int>&tmp,int left,int right)
{
long long cnt = 0;
if (left<right) /// import !! jian zhi
{
int mid = (left+right)/2;
cnt += inverspair(data,tmp,left,mid);
cnt += inverspair(data,tmp,mid+1,right);
cnt += mymerge(data,tmp,left,right);
}
return cnt % 1000000007;
}
};