数组中的逆序对(归并排序思想解题)
Posted Hot Autumn
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数组中的逆序对(归并排序思想解题)相关的知识,希望对你有一定的参考价值。
题目描述
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007输入描述:
题目保证输入的数组中没有的相同的数字
数据范围:
对于%50的数据,size<=10^4
对于%75的数据,size<=10^5
对于%100的数据,size<=2*10^5
输入例子:
10,5,7,3,2,8
输出例子:
10
思想:采用归并排序的思想。
在合并的时候统计逆序对的个数。
void mergeArray(vector<int>& L, vector<int>& R, long long left, long long mid, long long right, long long& counts)
int i = mid, j = right, k = right;
while(i >= left && j > mid)
if(L[i] > L[j]) // 如果左边 i 处数字比右边 j 处大,那么 i 处数字的逆序对个数就右边从开始到 j 处的数字个数。(因为合并的两个序列是有序的)
R[k--] = L[i--];
counts += j - mid;
else
R[k--] = L[j--];
while(i >= left)
R[k--] = L[i--];
while(j > mid)
R[k--] = L[j--];
for(int i=left; i <= right; i++)
L[i] = R[i];
counts %= 1000000007;
void inversePairs(vector<int>& data, vector<int>& copyVec, long long left, long long right, long long& counts)
if(left == right)
copyVec[left] = data[left];
else
int mid = left + (right - left ) / 2;
inversePairs(data, copyVec, left, mid, counts);
inversePairs(data, copyVec, mid+1, right, counts);
mergeArray(copyVec, data, left, mid, right, counts);
int InversePairs(vector<int> data) //【数组中的逆序对】
if(data.empty()) return 0;
long long counts = 0;// 统计逆序对的个数
vector<int> copyVec = data;// 归并排序用到的辅助数组
inversePairs(data, copyVec, 0, data.size()-1, counts);
return counts % 1000000007;
以上是关于数组中的逆序对(归并排序思想解题)的主要内容,如果未能解决你的问题,请参考以下文章
归并排序(归并排序求逆序对数)--16--归并排序--Leetcode面试题51.数组中的逆序对