您的位置:首页 > Web前端

剑指offer 编程题(34):数组中的逆序对

2017-12-24 10:25 357 查看
这道题真是难理解!!!!

在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007

输入描述:

题目保证输入的数组中没有的相同的数字

数据范围:

对于%50的数据,size<=10^4

对于%75的数据,size<=10^5

对于%100的数据,size<=2*10^5

class Solution {
public:
int res=0;
int InversePairs(vector<int> data) {
if(data.size()==0||data.size()==1)
return 1000000007;
vector<int> dup(data.size());
sort(data,dup,0,data.size()-1);
return res%1000000007;

}

void sort(vector<int> &data,vector<int> &dup,
int low,int high)
{
if(low>=high)
return;
int mid=(low+high)/2;
sort(data,dup,low,mid);
sort(data,dup,mid+1,high);
merge_sort(data,dup,low,mid,high);

4000
return;

}

void merge_sort(vector<int> &data,vector<int> &dup,
int low,int mid,int high )
{
int arr1=low,arr2=mid+1;
for(int i=low;i<=high;++i)
dup[i]=data[i];
for(int i=low;i<=high;++i)
{
if(arr1>mid)
data[i]=dup[arr2++];
else if(arr2>high)
data[i]=dup[arr1++];
else if(dup[arr1]<dup[arr2])
data[i]=dup[arr1++];
else{
data[i]=dup[arr2++];
res+=mid-arr1+1;
res%=1000000007;
}
}
return;
}


class Solution {
public:
int InversePairs(vector<int> data) {
if(data.size()<2)
return 0;
return mergesort(data,0,data.size()-1);
}
int mergesort(vector<int> &data,int begin,int end){
if(begin==end)
return 0;
int mid = (begin+end)/2;
int left = mergesort(data,begin,mid);
int right = mergesort(data,mid+1,end);
vector<int> temp(end-begin+1);
int i=begin,j=mid+1;
int cur=0,ret=0;
while(i<=mid && j<=end){
if(data[i]<=data[j])
temp[cur++]=data[i++];
else{
temp[cur++]=data[j++];
ret =(ret + mid-i+1)%1000000007;
}
}
while(i<=mid)
temp[cur++]=data[i++];
while(j<=end)
temp[cur++]=data[j++];
for(int i=begin;i<=end;i++){
data[i]=temp[i-begin];
}
return (ret+left+right)%1000000007;
}
};


class Solution {
public:
int InversePairs(vector<int> data) {
if(data.size()<2)
return 0;
return mergesort(data,0,data.size()-1);
}
int mergesort(vector<int> &data,int begin,int end){
if(begin==end)
return 0;
int mid = (begin+end)/2;
int left = mergesort(data,begin,mid);
int right = mergesort(data,mid+1,end);
vector<int> temp(end-begin+1);
int i=begin,j=mid+1;
int cur=0,ret=0;
while(i<=mid && j<=end){
if(data[i]<=data[j])
temp[cur++]=data[i++];
else{
temp[cur++]=data[j++];
ret =(ret + mid-i+1)%1000000007;
}
}
while(i<=mid)
temp[cur++]=data[i++];
while(j<=end)
temp[cur++]=data[j++];
for(int i=begin;i<=end;i++){
data[i]=temp[i-begin];
}
return (ret+left+right)%1000000007;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: