逆序对

作者: 杰米 | 来源:发表于2016-09-07 18:15 被阅读20次

在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。给你一个数组,求出这个数组中逆序对的总数。
概括:如果a[i] > a[j] 且 i < j, a[i] 和 a[j] 构成一个逆序对。

您在真实的面试中是否遇到过这个题? Yes
样例
序列 [2, 4, 1, 3, 5] 中,有 3 个逆序对 (2, 1), (4, 1), (4, 3),则返回 3 。

思路
在归并排序的merge过程中计算逆序对数目

class Solution {
public:
    /**
     * @param A an array
     * @return total of reverse pairs
     */
    long long reversePairs(vector<int>& A) {
        // Write your code here
        if(A.size()==0){
            return 0;
        }
        vector<int>temp(A.size(),0);
        int count = 0;
        mergeSort(A,temp,0,A.size()-1,count);
        return count;
    }
    
    void mergeSort(vector<int>& A,vector<int>& temp,int left,int right,int &count) {
        if(left == right) {
            return;
        }
        int mid = (left + right)/2;
        mergeSort(A,temp,left,mid,count);
        mergeSort(A,temp,mid+1,right,count);
        merge(A,temp,left,mid,right,count);
        
    }
    
    void merge(vector<int>& A,vector<int>& temp,int left,int mid,int right,int & count) {
        for(int i=left;i<=mid;i++) {
            int leftDigit = A[i];
            for(int j=right;j>=mid+1;j--){
                int rightDigit = A[j];
                if(leftDigit<=rightDigit) {
                    continue;
                } else {
                    int bigerCount = (j-(mid+1))+1;
                    count += bigerCount;
                     break;
                }
            }
        }
        
        int i = left;
        int j = mid+1;
        int k = left;
        while(i<=mid&&j<=right) {
            if(A[i]<A[j]) {
                temp[k++] = A[i++];
            } else {
                temp[k++] = A[j++];
            }
        }
        for(int p=i;p<=mid;p++) {
            temp[k++] = A[p];
        }
        for(int p=j;p<=right;p++){
            temp[k++]=A[p];
        }
        for(int p=left;p<=right;p++){
            A[p]=temp[p];
        }
    }
};

相关文章

  • 逆序对

    在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。给你一个数组,求出这个数组中逆序对的...

  • 逆序对

    逆序对的定义 假定有一个序列,对于序列中任意两个元素和,如果有,则称和是一对逆序对。我们接下来以洛谷P1908 逆...

  • 求逆序对

    问题:对于一个包含N个非负整数的数组A[1..n],如果有i < j,且A[ i ]>A[ j ],则称(A[ i...

  • 线代

    11/13 xd整理一下 行列式 1.逆序:时,两个数字组成一对逆序,只算一对。2.逆序数:为一个排列中的逆序对的...

  • 逆序单链表

    1、对一个单链表进行逆序操作。逆序之前为 head-->A-->B-->C-->None逆序之后为 head-->...

  • 逆序对 树状数组

    求逆序对除了有merge sort,还可以用树状数组比如输入数组为a,维护的树状数组为c,插入的时候,人为是c[a...

  • 532. 逆序对

    描述 在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。给你一个数组,求出这个数组中逆...

  • 数组的逆序对

    思路:归并排序每次把数组从中间拆分成两部分,先统计拆分数组内部的逆序对,再把这个数组排序,防止统计重复,最后再把拆...

  • 532. 逆序对

    在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。给你一个数组,求出这个数组中逆序对的...

  • 算法之基本排序

    基本排序算法比较 说几点: 排序的本质是什么?将逆序对变成正序对 --- 衍生出一道题:求一个数组的逆序对? 平均...

网友评论

      本文标题:逆序对

      本文链接:https://www.haomeiwen.com/subject/flojettx.html