本来想在这里问这个,但因为我忘了提到指数上的条件,所以提出了一个新问题。
问题是给定一个未排序的数组,找到和的索引i, j
对的总数。复杂性应该是线性的或尽可能接近它。i < j
arr[i] < arr[j]
如果目标要找到i < j
这样的对数arr[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);
。