我遇到了一个面试问题,我无法解决:
给定N个整数的阵列A,我们在2D平面中绘制N个盘,使得I th 盘以(0,I)为中心并且具有半径A [I]。如果J≠K且J th 且K th ,我们说J th 圆盘和K th 圆盘相交光盘至少有一个共同点。 写一个函数: int解(const vector& A); 如上所述,给定描述N个盘的阵列A,返回交叉盘对的数量。例如,给定N = 6和:
A[0] = 1 A[1] = 5 A[2] = 2
A[3] = 1 A[4] = 4 A[5] = 0
交叉光盘出现在11对元素中:
0 and 1,
0 and 2,
0 and 4,
1 and 2,
1 and 3,
1 and 4,
1 and 5,
2 and 3,
2 and 4,
3 and 4,
4 and 5.
所以函数应该返回11。
到目前为止并不困难,你可以找到每两个圆之间的交点,要么通过使用圆方程计算交点,要么更简单,如果两个中心之间的距离大于两个中心的总和,它们相交半径。该解决方案需要O(N 2 )。
受约束的是受访者应该提出时间复杂度最差的解决方案O(N.logN)并且需要空间O(N)。作为提示给出:可以编辑数组的元素。
Whenevr logN说,它弹出一个树或一个递归,但我再次无法创建新的数据结构,因为所需的空间是O(N)。所以我只能想象在数组上只有一个for循环,每一步都会进行某种递归,并根据需要改变数组值。但到目前为止,我已经来了。任何想法都赞赏