数组中的逆序对(归并排序思想解题)

原创 2016年08月29日 11:50:12

题目描述

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

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

数据范围:

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

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

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



输入例子:
10,5,7,3,2,8

输出例子:
10

思想:采用归并排序的思想。

在合并的时候统计逆序对的个数。



C++ 代码:
void mergeArray(vector<int>& L, vector<int>& R, long long left, long long mid, long long right, long long& counts) {
    int i = mid, j = right, k = right;
    while(i >= left && j > mid) {
        if(L[i] > L[j]) {// 如果左边 i 处数字比右边 j 处大,那么 i 处数字的逆序对个数就右边从开始到 j 处的数字个数。(因为合并的两个序列是有序的)
            R[k--] = L[i--];
            counts += j - mid;
        } else
            R[k--] = L[j--];
    }
    while(i >= left)
        R[k--] = L[i--];
    while(j > mid)
        R[k--] = L[j--];
    for(int i=left; i <= right; i++)
        L[i] = R[i];
    counts %= 1000000007;
}
void inversePairs(vector<int>& data, vector<int>& copyVec, long long left, long long right, long long& counts) {
    if(left == right)
        copyVec[left] = data[left];
    else {
        int mid = left + (right - left ) / 2;
        inversePairs(data, copyVec, left, mid, counts);
        inversePairs(data, copyVec, mid+1, right, counts);
        mergeArray(copyVec, data, left, mid, right, counts);
    }
}
int  InversePairs(vector<int> data) {//【数组中的逆序对】
    if(data.empty()) return 0;
    long long counts = 0;// 统计逆序对的个数
    vector<int> copyVec = data;// 归并排序用到的辅助数组
    inversePairs(data, copyVec, 0, data.size()-1, counts);
    return counts % 1000000007;
}



版权声明:本文为博主原创文章,转载请注明出处!

相关文章推荐

利用归并排序思想求数组中的逆序对

http://blog.csdn.net/seuliujiaguo/article/details/39555481 这是快排其他的应用 http://blog.csdn.net/seuliuji...

poj 2299 归并排序求逆序对 解题报告

Ultra-QuickSort

归并排序与逆序对问题---(解题报告)POJ1804---Brainman

归并排序,主要是以分治思想进行组合排序,先分再和,在和的过程中排序,排序的思路如下:先给你两组同向有序数组,首先判断两组数的首位的大小,并将较小的数保留到一个新数组中,接下来再比较较小组数的第二位和另...

归并排序 SHUOJ 1811 A20-逆序对数目 解题报告

归并排序 shuoj 1811

【剑指offer】面试题36:数组中的逆序对 - 归并排序

归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使...

【SGU 180】Inversions —— 归并排序或树形数组计算逆序对

分别采用归并排序、树形数组来计算逆序对

POJ 2299 Ultra-QuickSort(归并排序·树状数组·逆序对)

题意  给你一个数组求其中逆序对(ia[j]) 的个数  我们来看一个归并排序的过程: 给定的数组为[2, 4, 5, 3, 1],二分后的数组分别为[2, 4, 5], [1, 3],假设我们已...
  • acvay
  • acvay
  • 2015-04-10 20:27
  • 558

归并排序求数组逆序对

第四章 逆序对 4.1 题目 在数组中的两个数字如果前面的一个数字大于后面的数字,则这两个数字组成了一个逆序对;输入一个数组求该数组中的逆序对个数 比如:数组{ 1, 5, 7, 3, 2},则逆序对...

【算法】逆序对问题的四种解法(归并排序,BST,树状数组,线段树)及变形

引发我对逆序对这个问题思考的源自这道题:315. Count of Smaller Numbers After Self 以前我以为求一个序列逆序对个数的解法就是归并排序的改版

数组中的逆序对(归并排序+剑指offer)

数组中的逆序对 参与人数:1170时间限制:1秒空间限制:32768K通过比例:27.36%最佳记录:0 ms|8552K(来自  ) 题目描述 在数组中的两个数字,如果...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)