LintCode532 逆序对

  1. Reverse Pairs
    For an array A, if i < j, and A [i] > A [j], called (A [i], A [j]) is a reverse pair.
    return total of reverse pairs in A.

Example
Given A = [2, 4, 1, 3, 5] , (2, 1), (4, 1), (4, 3) are reverse pairs. return 3

使用归并排序:时间复杂度nlog n,归并基于分治,分为log n,治为n。
在合并的时候计算逆序对,由于左右两个子数组已经排序,所以会很方便。

public long reversePairs(int[] A) {
    // write your code here
    if(A == null || A.length == 0) return 0;
    return mergeSort(A,0,A.length-1);
}
public long mergeSort(int[] A, int start, int end){
    if(start >= end) return 0;
    int sum = 0;
    int mid = start + (end - start) / 2;
    sum += mergeSort(A,start,mid);
    sum += mergeSort(A,mid+1,end);
    sum += merge(A,start,mid,mid+1,end);
    return sum;
}
public long merge(int[] A, int start1, int end1, int start2, int end2){
    int sum = 0;
    int[] temp = new int[A.length];
    int index1 = start1;
    int index = start1;
    while(start1 <= end1 && start2 <= end2){
        if(A[start1] > A[start2]){
            temp[index++] = A[start2++];
            sum += end1 - start1 + 1;
        }else{
            temp[index++] = A[start1++];
        }
    }
    while(start1 <= end1){
        temp[index++] = A[start1++];
    }
    while(start2 <= end2){
        temp[index++] = A[start2++];
    }
    for(int i = index1; i <= end2; i++){
        A[i] = temp[i];
    }
    return sum;
}

猜你喜欢

转载自blog.csdn.net/fruit513/article/details/84847391