这是一个编程问题,我几个月前在一家公司接受开发人员的采访时就遇到了这个问题。
给定N个整数的数组A,数组的反转被定义为任意一对索引(a,b),使得< b和A [b]< A [a ]。
写一个函数:
int inversion_count(int A[], int n);
计算A中的反转次数,如果超过1,000,000,000,则返回-1。例如,在以下数组中
A[0]=-1 A[1]=6 A[2]=3 A[3]=4 A[4]=7 A[5]=4
有四个反转:
(1,2) (1,3) (1,5) (4,5)
所以函数应返回4.
我以一种非常常见的方式解决了这个问题:使用双循环。
int i, j;
long count;
for (i = 0; i < n; i++) {
for (j = i+1; j < n; j++) {
if (A[i] > A [j]) count++;
if (count > 1000000000) break; // exit loop
}
if (count > 1000000000) break; // exit loop
}
if (count > 1000000000) return -1;
else return count;
所以它的运行时间是:O(nsquare),我被告知它效率不高。我现在正在考虑一种解决这个问题的不同方法,可能使用 n log n 算法,但我还没想到它。有什么想法吗?
答案 0 :(得分:1)
这个答案解释了一个O(n log n)算法:Counting inversions in an array。
诀窍是首先排序(O(n log n)),然后使用二进制搜索来查找元素(也是O(n log n)),从而得到O(n log n)。