题目描述:
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007
1.暴力解法 两个for循环,时间复杂度为n^2不满足要求
2.考虑在归并排序过程中 ,左右两段合并时,只要左边的第i 个数大于右边的第j 个数,则,左边剩下的数也大于第j个数。代码很简单,原理可以参考LeetCode上面的视频讲解。
class Solution {
public:
int InversePairs(vector<int> data) {
int ret=0;
MergeSort(data,0,data.size()-1,ret);
return ret;
}
void MergeSort(vector<int>&array,int left,int right,int &ret)
{
if(left>=right)
return;
int mid = left + ((right - left) >> 1);
MergeSort(array,left,mid,ret);
MergeSort(array,mid+1,right,ret);
merge(array,left,mid,right,ret);
}
void merge(vector<int>&array,int left,int mid,int right,int &ret)
{
int k =0,i = left,j = mid+1;
vector<int>temp(right-left+1);
while(i<=mid && j<=right)
{
if(array[i]<=array[j])
temp[k++]=array[i++];
else
{
temp[k++]=array[j++];
ret = (ret + (mid-i+1))%1000000007;
}
}
while(i<=mid)
temp[k++] = array[i++];
while(j<=right)
temp[k++] = array[j++];
for (k = 0, i = left; i <= right; ++i, ++k)
array[i] = temp[k];
}
};