【剑指offer-解题系列(36)】 数组中的逆序对
2017-05-29 13:21
351 查看
题目描述
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数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
分析
假如写出归并排序的过程后,该方法只需要在归并排序中添加记录总数的一句话就行。
代码实现
int InversePairs(vector<int> a) {
long long total_pairs = 0;
vector<int> temp(a);
mergeSort( a, temp, 0, a.size()-1 , total_pairs);
return total_pairs%1000000007 ;
}
void merge(vector<int>&a,vector<int>&temp, int start,int mid,int end ,long long & total_pairs){
int i = start;
int j = mid+1; ///参照两个数的情况,j不能取mid
int ind = start;
while(i<=mid && j<=end){
if(a[i] <= a[j] ){
temp[ind++]= a[j++];
}
else{
temp[ind++]= a[i++];
total_pairs+= (end-j+1);
}
}
for(int k = i;k<=mid ;k++){
temp[ind++]= a[k];
}
for(int k = j;k<=end;k++)
temp[ind++]= a[k];
for(int k =start;k<=end;k++){
a[k]=temp[k];
}
}
void mergeSort(vector<int>&a,vector<int>&temp,int start,int end ,long long & total_pairs){
int n = a.size();
if(n<=0)
return ;
if(start<end){
int mid = (start + end)/2;
mergeSort( a, temp, start, mid ,total_pairs);
mergeSort( a, temp, mid+1, end ,total_pairs);
merge( a, temp, start, mid, end ,total_pairs);
}
}
相关文章推荐
- 剑指Offer 面试题36:数组中的逆序对及其变形(Leetcode 315. Count of Smaller Numbers After Self)题解
- 剑指offer之面试题36数组中的逆序对
- 剑指Offer面试题36:数组中的逆序对
- [剑指offer][面试题36]数组中的逆序对
- 【剑指offer】面试题36:数组中的逆序对
- 剑指Offer面试题36(Java版):数组中的逆序对
- 剑指offer面试题36数组中的逆序对数
- 剑指offer 36 - 数组中的逆序对
- 【剑指offer】5.3时间效率与空间效率的平衡——面试题36:数组中的逆序对
- 【剑指offer】面试题36:数组中的逆序对
- 剑指offer 面试题36:数组中的逆序对
- 剑指offer 面试题36 数组逆序对个数
- 剑指offer——面试题36:数组中的逆序对
- 剑指offer-面试题36-数组中的逆序对(O(n)复杂度)
- 剑指offer 36题 【时间空间效率的平衡】数组中的逆序对
- 剑指offer面试题36-数组中的逆序对
- 剑指Offer----面试题36:数组中的逆序对
- 【剑指offer】面试题36-数组中的逆序对
- 剑指offer——面试题36:数组中的逆序对(归并排序)
- 【剑指offer】题目36 数组中的逆序对