【发布时间】:2014-06-02 17:17:24
【问题描述】:
我知道 n 元素数组中inversions 的数量可以用 O(n log(n) ) 操作使用enhanced merge sort。
但是,我遇到了一个不同的解决方案,只要输入是 (1, 2, 3, ..., n-1, n):
编辑:-
我很抱歉我粘贴的代码在所有情况下都不起作用。实际上,这段代码用于this question,并且通过了所有案例。但我仍然留下代码,以便它可以作为一些直觉,也许会出现这个问题的线性时间解决方案。
注意:- 下面提到的代码不正确。
/* int in = 0;
for (int i = 0; i < n; i++) {
a[i] = a[i] - i - 1;
}
for (int i = 0; i < n; i++) {
if (a[i] > 0)
in = in + a[i];
else if (a[i] < -1)
in = in - a[i] - 1;
} */
现在的问题是我们能否为这个问题提出一个线性时间解决方案?
【问题讨论】:
-
该代码是否正确复制?
i在内部和外部for循环中被修改? -
在这种情况下到底什么是反转?
-
当 a[i] > a[j] 并且 i
-
@Spundum 这是通过合并排序计算反转的链接geeksforgeeks.org/counting-inversions。
-
@Spundum 归并排序方法是一种通用算法,适用于任何类型的数组,但上述算法仅适用于数组是 1,2,3 的随机排列... N。例如,如果 N =4 。那么数组可以是2,4,3,1。