编程面试问题(数组反转)

时间:2011-07-18 15:12:01

标签: c

  

可能重复:
  Counting inversions in an array

这是一个编程问题,我几个月前在一家公司接受开发人员的采访时就遇到了这个问题。

给定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 算法,但我还没想到它。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

这个答案解释了一个O(n log n)算法:Counting inversions in an array

诀窍是首先排序(O(n log n)),然后使用二进制搜索来查找元素(也是O(n log n)),从而得到O(n log n)。