题目描述:
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007。
题目保证输入的数组中没有的相同的数字。
数据范围:
对于%50的数据,size<=
1
0
4
10^4
104;
对于%75的数据,size<=
1
0
5
10^5
105;
对于%100的数据,size<=
2
∗
1
0
5
2*10^5
2∗105;
Example:
input:
1,2,3,4,5,6,7,0
output:
7
思路:
归并排序过程中统计逆序对。出了好多bug,…,以前会的一点都忘没了。
代码:
class Solution {
public:
int cnt;
int InversePairs(vector<int> data) {
cnt = 0;
if (!data.empty())
mergeSortUp2Down(data, 0, data.size()-1);
return cnt;
}
void mergeSortUp2Down(vector<int>& data, int st, int ed) {
if (st >= ed) return;
int mid = ((st + ed) >> 1);
mergeSortUp2Down(data, st, mid);
mergeSortUp2Down(data, mid+1, ed);
mergeSort(data, st, mid, ed);
}
void mergeSort(vector<int>& data, int st, int mid, int ed) {
vector<int> tmp(ed-st+1);
int i = mid, j = ed, k = 0;
while(i >= st && j >= mid+1) {
if (data[i] <= data[j]) {
tmp[k++] = data[j--];
}else {
cnt += j - mid;
tmp[k++] = data[i--];
cnt %= 1000000007;
}
}
while(i >= st) {
tmp[k++] = data[i--];
}
while(j >= mid+1) {
tmp[k++] = data[j--];
}
for (i=0; i<k; ++i) {
data[st+i] = tmp[k-1-i];
}
}
};