【问题标题】:Please help me to understand this codility test请帮助我理解这个代码测试
【发布时间】:2014-05-02 21:22:55
【问题描述】:

鉴于下面的代码测试:

给定N 整数数组A,我们在二维平面中绘制N 圆盘,使得I-th 圆盘以(0,I) 为中心,半径为A[I]。我们说J-th 光盘和 K-th disc intersect ifJ ≠ KandJ-th andK`-th 盘至少有一个公共 观点。

写一个函数class Solution { public int solution(int[] A); },给定一个数组 A 描述 N 圆盘如上所述,返回相交对的数量 光盘。例如,给定N=6 和:

A[0] = 1 A[1] = 5 A[2] = 2
A[3] = 1 A[4] = 4 A[5] = 0

相交的圆盘出现在11对元素中:

0 和 1,
0和2,
0和4,
1和2,
1和3,
1和4,
1和5,
2和3,
2和4,
3和4,
4 和 5。

所以函数应该返回11

如果相交对的数量超过 10,000,000,则该函数应返回 −1
假设:

-N[0..100,000]范围内的整数;
- 数组 A 的每个元素都是 [0..2147483647] 范围内的整数。

复杂性

  • 预期的最坏情况时间复杂度为 O(N*log(N));
  • 预期的最坏情况空间复杂度为 O(N),超出输入存储(不包括 输入参数所需的存储空间)。

这 11 对来自哪里,因为只有 6 个元素?

【问题讨论】:

  • 这些对来自使用给定规则从两个元素的 30 种可能组合中进行选择。
  • 我相信我们需要在这里考虑组合而不是排列。因此,这些对来自于从 C(n,r)=C(6,2) 中两个元素的 15 种可能组合中进行选择

标签: java algorithm


【解决方案1】:

只有6个元素,但可能的对数为6*5/2=15(一般形式:n(n-1)/2)),所以即使有6个点,也最多可能有15个(包括)交叉点,如上所述.

磁盘的数量不是最大的15个,因为有些'磁盘'不相交,例如磁盘(0,0)和磁盘(0,5)没有共同点。 (0,0) 包括点{(0,0), (0,1)}(0,5) 磁盘包括点{ (0,5) }
由于这两组的交集是空的 - (0,0);(0,5) 不是有效的磁盘对,不应包含在内。

【讨论】:

  • 非常有帮助的解释
【解决方案2】:

这 11 对与问题中列出的完全一样。每个圆盘都以(0, I) 为中心,因此每个圆盘与它的两个邻居中的每一个都有 1 个距离单位(除了圆盘 0 和圆盘 N-1,它们只有一个邻居)。给定特定的数组 A:

  • 圆盘 0 的半径为 1,因此它与圆盘 1 相交
  • 圆盘 1 的半径为 5,因此它与圆盘 0、2、3、4、5 相交
  • 圆盘 2 的半径为 2,因此它与圆盘 0、1、3、4 相交
  • 圆盘 3 的半径为 1,因此它与圆盘 2、4 相交
  • 圆盘 4 的半径为 4,因此它与圆盘 0、1、2、3、5 相交
  • 圆盘 5 的半径为 0,因此它与没有圆盘相交

如果您只计算此列表中的唯一对(例如,2 个与 3 相交,3 个与 2 相交,算作一个),则为 11 个相交。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-21
    • 2014-12-26
    相关资源
    最近更新 更多