鉴于我有一个如下数组:
arr = [8, 13, 14, 10, 6, 7, 8, 14, 5, 3, 5, 2, 6, 7, 4]
我想计算连续数字序列的数量。例如,在上面的数组中,连续数字序列(或数组切片)是:
[13,14]
[6,7,8]
[6,7]
因此我们有3个这样的切片。什么是有效的算法来计算这个?我知道如何做到这一点O(N ^ 2)但我正在寻找比这更好的东西。
答案 0 :(得分:4)
arr = [8, 13, 14, 10, 6, 7, 8, 14, 5, 3, 5, 2, 6, 7, 4]
p arr.each_cons(2).chunk{|a,b| a.succ == b || nil}.count #=> 3
nil
对chunk
- 方法有特殊含义:它会导致项目被删除。
答案 1 :(得分:2)
arr = [8, 13, 14, 10, 6, 7, 8, 14, 5, 3, 5, 2, 6, 7, 4]
result = []
stage = []
for i in arr:
if len(stage) > 0 and i != stage[-1]+1:
if len(stage) > 1:
result.append(stage)
stage = []
stage.append(i)
print result
输出:
[[13, 14], [6, 7, 8], [6, 7]]
此代码的时间复杂度为 O(n)。 (只有一个for
循环。并且不难看出循环中的每次迭代都是O(1)。)
答案 2 :(得分:1)
我会使用Enumerable#slice_before
执行以下操作:
a = [8, 13, 14, 10, 6, 7, 8, 14, 5, 3, 5, 2, 6, 7, 4]
prev = a[0]
hash = Hash[a.slice_before do |e|
prev, prev2 = e, prev
prev2 + 1 != e
end.map{|e| [e,e.size] if e.size > 1}]
hash # => {[13, 14]=>2, [6, 7, 8]=>3, [6, 7]=>2}
hash.size # => 3
答案 3 :(得分:0)
我认为这可以在O(N)时间内完成。如果您只想要计数,
如果您想要连续增加连续元素的部分(不清楚您的问题)