题目:数组中的逆序对
题目描述
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007
输入描述:
题目保证输入的数组中没有的相同的数字
数据范围:
对于%50的数据,size<=10^4
对于%75的数据,size<=10^5
对于%100的数据,size<=2*10^5
示例1
输入
1,2,3,4,5,6,7,0
输出
7
思路
归并排序。一定要用long long然后取余,不然后面50%的数据过不了。将数组递归的分为前半部分和后半部分,当前半部分i>后半部分j时,count要加上(start~mid)个,然后排好序,避免重复计算。
class Solution {
public:
long long Merge(vector<int> &data, vector<int> ©, int start, int end){
if(start==end){
copy[end]=data[end];
return 0;
}
int mid = (start+end)/2;
long left = Merge(data, copy, start, mid);//左边的逆序数
long right = Merge(data, copy, mid+1, end);//右边的逆序数
long long count = 0;//当前的逆序数
int i=start, j=mid+1;
int index=start; // 记录copy的信息
while(i<=mid && j<=end){
if(data[i]>data[j]){
count += mid-i+1;
copy[index++]=data[j++];
}
else{
copy[index++]=data[i++];
}
}
//将上述未完成复制的数组,排好序
for(; i<=mid;i++)
copy[index++]=data[i];
for(; j<=end;j++)
copy[index++]=data[j];
//复制
for(i=start;i<=end;i++)
data[i]=copy[i];
return count+left+right;
}
int InversePairs(vector<int> data) {
int size = data.size();
if(size<=1) return 0;
vector<int> copy;
for(int i=0;i<size;i++)
copy.push_back(data[i]);
return Merge(data, copy, 0, size-1)%1000000007;
}
};
加上测试的完整代码
#include<bits/stdc++.h>
#include<string>
#include<algorithm>
#include<vector>
using namespace std;
class Solution {
public:
long long Merge(vector<int> &data, vector<int> ©, int start, int end){
if(start==end){
copy[end]=data[end];
return 0;
}
int mid = (start+end)/2;
long left = Merge(data, copy, start, mid);//左边的逆序数
long right = Merge(data, copy, mid+1, end);//右边的逆序数
long long count = 0;//当前的逆序数
int i=start, j=mid+1;
int index=start; // 记录copy的信息
while(i<=mid && j<=end){
if(data[i]>data[j]){
count += mid-i+1;
copy[index++]=data[j++];
}
else{
copy[index++]=data[i++];
}
}
//将上述未完成复制的数组,排好序
for(; i<=mid;i++)
copy[index++]=data[i];
for(; j<=end;j++)
copy[index++]=data[j];
//复制
for(i=start;i<=end;i++)
data[i]=copy[i];
return count+left+right;
}
int InversePairs(vector<int> data) {
int size = data.size();
if(size<=1) return 0;
vector<int> copy;
for(int i=0;i<size;i++)
copy.push_back(data[i]);
return Merge(data, copy, 0, size-1)%1000000007;
}
};
int main(){
Solution s;
// vector<int> v = {1,2,3,4,5,6,7,0};//7
vector<int> v = {364,637,341,406,747,995,234,971,571,219,993,407,416,366,315,301,601,650,418,355,460,505,360,965,516,648,727,667,465,849,455,181,486,149,588,233,144,174,557,67,746,550,474,162,268,142,463,221,882,576,604,739,288,569,256,936,275,401,497,82,935,983,583,523,697,478,147,795,380,973,958,115,773,870,259,655,446,863,735,784,3,671,433,630,425,930,64,266,235,187,284,665,874,80,45,848,38,811,267,575};
// 2519
// vector<int> v(500000,1);
cout<<s.InversePairs(v);
return 0;
}