题目描述
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007
输入描述:
题目保证输入的数组中没有的相同的数字
数据范围:
对于%50的数据,size<=10^4
对于%75的数据,size<=10^5
对于%100的数据,size<=2*10^5
输入例子:
1,2,3,4,5,6,7,0
输出例子:
7
python实现(运行超时,不知道为什么):
# -*- coding:utf-8 -*-
class Solution:
def __init__(self):
self.result = 0
# 类归并
def InversePairs(self, data):
# write code here
n = len(data)
if n==0 or n==1:
return 0
self.merge_sort(data, 0, n-1)
return self.result%1000000007
def merge_sort(self, data, start, end):
if start<end:
mid = (start+end)//2
self.merge_sort(data, start, mid)
self.merge_sort(data, mid+1, end)
self.merge(data, start, mid, end)
def merge(self, data, start, mid, end):
tmp = []
i, j = start, mid+1
while i<=mid and j<=end:
if data[i]<data[j]:
tmp.append(data[i])
i += 1
elif data[i]>data[j]:
tmp.append(data[j])
self.result += (mid-i+1)%1000000007
j += 1
else:
pass # 题目说没有相等的情况
if i<=mid:
tmp += data[i:mid+1]
if j<=end:
tmp += data[j:end+1]
data[start:end+1] = tmp[:]
c++实现:
class Solution {
public:
int InversePairs(vector<int> data) {
int n = data.size();
if(n==0 || n==1)
return 0;
return mergeSort(data, 0, n-1);
}
int mergeSort(vector<int> &data, int start, int end){
if(start<end){
int mid = start+(end-start)/2;
int leftCnt = mergeSort(data, start, mid);
int rightCnt = mergeSort(data, mid+1, end);
int mergeCnt = merge(data, start, mid, end);
return (leftCnt+rightCnt+mergeCnt)%1000000007;
}
return 0;
}
int merge(vector<int> &data, int start, int mid, int end){
int *tmp = new int[end-start+1];
int i=mid, j=end, k=end-start;
int cnt = 0;
while(i>=start && j>=mid+1){
if(data[i]<=data[j]){
tmp[k] = data[j];
j--;
}else{
tmp[k] = data[i];
i--;
cnt += j-(mid+1)+1;
cnt %= 1000000007;
}
k--;
}
while(i>=start){
tmp[k--] = data[i--];
}
while(j>=mid+1){
tmp[k--] = data[j--];
}
for(int i=start, j=0;i<=end; i++,j++)
data[i] = tmp[j];
delete[] tmp;
return cnt%1000000007;
}
};