给定数字列表中的子系列数

时间:2015-01-17 11:54:46

标签: c# performance algorithm

所以我有这个问题。 我必须以最有效的方式(最低运行时间)编写一个算法,它接收2个数字N和K. 5< N< 100000,和K> 0。 之后,它接收N个正整数(数字列表),然后它打印在每个子系列中至少有2个数字的条件下有多少个子系列(不一定继续),并且子系列中的每个数字都更小由同一子系列中的以下数字的K.

例如:N = 6,K = 5。 和数字列表:1 6 8 11 12 20。 印刷品为17.(17个子系列)

(6 1),(8 6 1),(11 8 6 1),(12 11 8 6 1),(12 8 6 1),(11 6 1),(12 11 6 1),< / p>

(8 6),(11 8 6),(12 11 8 6),(12 8 6),(11 6),(12 11 6),

(11 8),(12 11 8),(12 8),

(12 11)。

(从右到左(从最小到最大)) 它只会打印17(它们的数量)。 好吧,我试过写一个算法,但我认为它很糟糕,我相信有更好的方法,我的是O(N ^ 3)。这是一个混乱和复杂,我相信有一种我不知道的伎俩.. 抱歉我的英语不好,如果我没有正确解释。 谢谢您的帮助!我很感激! ;)

1 个答案:

答案 0 :(得分:0)

我不确定我是否正确理解了问题陈述,但我会尝试提出一些想法。

首先,例如,按递增顺序对序列进行排序。这应该是你O(n log n)。

假设您的排序数组是A.对于每个元素,计算存在多少有效序列,使它们以给定元素结束。让我们将这个数字表示为f(l),其中l是A中元素的索引。假设你为索引小于i的所有元素解决了这个问题。比f(i)是所有f(j)的总和,使得j <1。 i和A [i] -A [j]&lt; = K。

结果你应该得到类似O(n ^ 2)的解决方案。