class Solution {
private:
long int cnt = 0; //用于记录逆序对的个数,这里要定义long int int可能会溢出
public:
void merge(vector<int> &arr, int left, int mid, int right)
{
vector<int> temp(right-left+1);
int i = left, j = mid + 1, k = 0;
while(i<=mid && j<=right)
{
if(arr[i] <= arr[j])
{
temp[k++] = arr[i++];
}
else
{
temp[k++] = arr[j++];
cnt = (cnt + mid - i + 1); // 由于左边arr[i]大于右边的arr[j],且是升序的,所以i---mid之间的数都大于arr[j]
}
}
// 下面是将上面左右两边没有比完的数据进行分配
while(i<=mid)
{
temp[k++] = arr[i++];
}
while(j<=right)
{
temp[k++] = arr[j++];
}
for(int m=0; m<right-left+1; m++)
{
arr[left + m] = temp[m];
}
}
void mergeSort(vector<int> &arr, int left, int right)
{
// 递归条件
if(left >= right)
{
return;
}
int mid = (left+right)/2;
mergeSort(arr, left, mid);
mergeSort(arr, mid+1, right);
merge(arr, left, mid, right);
}
int InversePairs(vector<int> data)
{
if(data.size()<=1) return 0;//如果少于等于1个元素,直接返回0
mergeSort(data, 0, data.size()-1);
return cnt%1000000007;
}
};