计算数组中索引的总数对,使得arr [i]< arr [j]和i< Ĵ

时间:2012-12-09 21:41:08

标签: algorithm

想要问这个here但是因为我忘了提及指数的条件,所以创造了一个新问题。

问题是一个未排序的数组,找到i, ji < j的索引arr[i] < arr[j]对的总数。复杂性应该是线性的或接近它。

1 个答案:

答案 0 :(得分:1)

如果目标要找到i < jarr[i] > arr[j]的数量,那么它就是反转计数,可以通过对数组进行合并排序并计算每个项目的值来确定过去了。

如果我们按降序排序,我们也可以这样做。

int pairs_count(int[] arr, int lo, int hi) {
    if (hi <= lo) return 0;
    int mid = (lo+hi)/2;
    int count = pairs_count(arr, lo, mid);
    count += pairs_count(arr, mid+1,hi);
    count += merge(arr, lo, mid, hi);
    return count;
}

int merge(int[] arr, int lo, int mid, int hi) {
    int[] scratch = new int[hi-lo+1];
    int l = lo, r = mid+1, k = 0, count = 0;
    while(l <= mid && r <= hi) {
        if (arr[r] > arr[l]) {
            scratch[k++] = arr[r++];
            count += mid-l+1;
        } else {
            scratch[k++] = arr[l++];
        }
    }
    while(l <= mid) {
        scratch[k++] = arr[l++];
    }
    while(r <= hi) {
        scratch[k++] = arr[r++];
    }
    for(k = 0; k < scratch.length; ++k) {
        arr[lo+k] = scratch[k];
    }
    retrun count;
}

使用pairs_count(arr, 0, arr.length - 1);调用它。