题目描述
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007
有两种思路:
1. 暴力求解,复杂度O(N2) 运行超时
2. 使用归并排序的思想,先将数组分组,内部排序,过程中统计内部的逆序对,排序之后,内部已经没有逆序对,在两组合并为一组,在统计这一组的逆序对
代码如下:
class Solution {
public:
//方法一:暴力求解 运行超时
int inverse_pairs(vector<int>& data){
int count = 0;
for(int i = 0; i < data.size(); i++){
for(int j = i; j < data.size(); j++){
if(data[i] > data[j]){
count++;
count %= 1000000007;
}
}
}
return count;
}
//方法二:使用归并排序的思想
int reverse_count = 0;
void inverse_pairs_merge(vector<int>& data, int start, int mid, int end){
vector<int> temp;
int i = start;
int j = mid+1;
while(i <= mid && j <= end){
if(data[i] < data[j]){
temp.push_back(data[i++]);
}
else{
temp.push_back(data[j++]);
reverse_count += (mid-i+1); //前边数组从i开始到mid,都是大于j的
reverse_count %= 1000000007;
}
}
while(i <= mid){
temp.push_back(data[i++]);
}
while(j <= end){
temp.push_back(data[j++]);
}
for(int k = 0; k < temp.size(); k++){
data[start+k] = temp[k];
}
}
void inverse_pairs_mergesort(vector<int>& data, int start, int end){
if(start < end){
int mid = (start + end) / 2;
inverse_pairs_mergesort(data, start, mid);
inverse_pairs_mergesort(data, mid+1, end);
inverse_pairs_merge(data, start, mid, end);
}
}
int InversePairs(vector<int> data) {
//inverse_pairs_mergesort(data, 0, data.size()-1);
//return reverse_count;
return inverse_pairs(data);
}
};