LINTCODE——逆序对

来源:互联网 发布:ip域名查询 编辑:程序博客网 时间:2024/06/03 23:39

LINTCODE——逆序对

思路:本来直接统计的,结果TIMEOUT,后来改用归并排序统计,通过了,就一个注意的,数组num分成L,mid,R三段时,如果L<=i<=mid ,mid+1 <= j <=R,此刻如果num[j] < num[i] ,那么对于J来说就有mid+i-1个逆序对;

class Solution {private :     long long count = 0;     vector<int> num;public:    /*     * @param A: an array     * @return: total of reverse pairs     */    long long reversePairs(vector<int> &A) {        // write your code here        int R = A.size() - 1, L = 0 ;        num.resize(R+1,0);        sort(A , L , R );        return count;    }    void sort(vector<int> &A , int L ,int R )    {        if(R <= L)            return;        int mid = (L+R)>>1;        sort(A,L,mid);        sort(A,mid+1,R);        merge(A,L,mid ,R);    }    void merge(vector<int> &A , int L ,int mid ,int R )    {        for(int x = L ; x <= R ; x++)            num[x] = A[x] ;        for(int k = L ,i = L ,j = mid+1; k <= R ; k++ )        {            if( i > mid)                A[k] = num[j++];            else if(j > R)                A[k] = num[i++];            else if(num[j] < num[i])            {                A[k] = num[j++];                count += (mid - i + 1);            }            else                A[k] = num[i++];        }    }};