这是一个面试问题。
以下是如图所示的以下方式排列的音符。 给出每个音符的起点和终点。
例如。 [2-5],[3-9],[7-100]长度限制为0-10 ^ 9 在这个例子中,所有三个音符都是可见的。
我们需要找出,从顶部看,有多少笔记可见?
我尝试在O(n * n)中求解,其中n是通过检查每个音符的每个音符与其他音符的音符数量。但是在这种方法中我们如何确定两个音符是否在不同的堆栈中。 最终没有达到解决方案。
O(n)溶液将是优选的,因为访问者要求O(n)溶液
答案 0 :(得分:0)
如果O(n log n)足够:首先,将输入中的所有数字重新映射到0 ..(2 * n + 1)之间(即,如果数字x_i是所有数字中的第j个最小数字)输入中的数字,用j替换所有x_i。然后,您可以在分段树上使用Painter算法。
详细说明:
考虑一个大小的数组(2 * n + 1)。用-1初始化所有这些单元格。
画家的算法:将最后一个(在底部)的钞票迭代到最顶部的钞票。对于从a_i到b_i的每个音符覆盖,用i替换索引在a_i和b_i之间的数组中的所有单元格的值。在该算法的最后,我们可以简单地查看数组中的哪些索引,这些索引构成了所有可见的注释。然而,天真地这适用于O(N ^ 2)。
段树:因此,我们使用段树而不是使用数组。然后可以在O(log N)中完成上述操作。
答案 1 :(得分:0)
如果输入中的音符顺序为"前者位于顶部"比它容易:
保持min_x和max_x的值,将其初始化为第一个音符的x值。迭代音符,x值大于max_x或小于min_x的每个音符将这些相应的值更改为其自己的x值并被视为可见,否则不会。完成迭代并返回可见注释列表。收集现金。