这是我在一家科技公司遇到的面试问题。我弄错了,我认为这注定了我的机会,但是老实说,我仍然找不到答案……这就是问题所在。假设序列中的所有元素都是唯一的。
我们有两个有限序列:X = {Xi},Y = {Yi}其中Yi是Xi的子序列。
让我们将它们写为单独的数组:[X1,X2,...,Xn],[Y1,Y2,...,Yk]其中n是X的长度,k是Y的长度,显然,因为Y是X的子序列,所以n> = k。
例如
X=[1, 10, 5, 7, 11, -4, 9, 5]
y=[10, 7, -4, 9]
然后,对于Y中的每个元素,我们要查找X中 1)出现在该元素之后的元素数量,并且 2)大于该元素。
使用上面的示例
X=[1, 10, 5, 7, 11, -4, 9, 5]
y=[10, 7, -4, 9]
ans=[1, 2, 2, 0]
explanation:
the first element of ans is 1 because only 11 appears after 10 and greater than 10 in X,
so there's only 1 element
second element of ans is 2 since 11, 9 both appear after 7 in X, so there are 2 elements
that appear after 7 and greater than 7.
the third element of ans is also 2 since 9, 5 appear after -4 and are both greater than
-4 in X.
the fourth element is 0 since no element in X appears after and greater than 9.
面试官要我解决O(N)时间复杂性问题,其中N是X的长度。我没有找到解决方法。
有人有主意吗?
答案 0 :(得分:0)
如果有一种可以解决此问题的算法,则通过设置Y = X
,可以使它提供足够的信息来对X
进行排序,而无需X
中的元素之间进行任何进一步的比较。因此,在通常的假设下,您无法在线性时间内执行此操作,即X
中的任意整数可以在固定时间内进行操作,但对其大小没有固定限制。
您可以通过在X
中向后走,并维护到目前为止看到的元素的顺序统计树,很容易地在O(N log N)时间中完成此操作。参见https://en.wikipedia.org/wiki/Order_statistic_tree
答案 1 :(得分:-1)
我认为这与不可能进行排序是相同的,这是原因
为解决此问题,我们应将状态用于先前的计算保存在有限数量的变量中,例如存储加,减或乘。
因此,如果A
中有很多数字,而B
中却没有数字,那显然是没有用的,而且我们已经知道唯一可行的解决方案是将先前的状态保存在有限变量中,因此我们可以没有仅与A
中的项目相关的数字。
到目前为止,我们知道要解决的问题是应该弄清楚保存状态算法,对于保存状态,我们只能在Y
中存储一些代表当前元素的所有先前编号的数字,所有这些计算都不会之所以提供帮助,是因为我们不知道Y
中的下一个项目(例如,当前数字是-1000
,下一个数字是3000
,而X
中的其他数字是1,2,3 )。因此,因此我们无法保存与Y
中的当前元素相关的任何存储的数字。我们也不能有与Y
不相关的任何数字(因为它完全有用)