【第22期】观点:IT 行业加班,到底有没有价值?

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

原创 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;
}



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

相关文章推荐

码农小汪-剑指Offer之33 -数组中的逆序对 冒泡排序 归并排序

题目描述在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。解题思路我一看到这道题,首先就想到了冒泡排序,总是两两比较然后统计次...

排序算法篇(归并排序)

归并排序 归并排序是另一类不同的排序方法,所谓归并,就是把两个或者两个以上的有序表合并成一个新的有序表的过程。 归并排序的基本思想: 将一个含有n个序列的有序表看成是n个长度为1的有序表,然后两两归并,得到[n/2]个长度为2的有序表,然后再两两归并,直到得到一个长度为n的有序表为...

程序员升职加薪指南!还缺一个“证”!

CSDN出品,立即查看!

(第三章 1)通用数组(void**)的归并排序

     我简化了书上的实现,每个数组元素是void*类型,两个void*元素的大小比较通过调用者提供的回调函数typedef int (*compare_fun)(void* a, void* b);实现   泣血的总结:    ...

归并排序思想应用之----求数组中的逆序对

求数组中的逆序对的问题我在大一的时候就遇到过,没想到三年了。还是不

归并排序求逆序对的代码(C语言)

#include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #define MAX 32767 int merge(int *array, int p,int q,int r) { //归并array[p....
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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