最长子序列:缺少最后一个元素
longest subsequence: missing last element
大家好我正在研究最长子序列算法,我的想法是从数组中找到数字的子序列。我正在使用 Ruby,到目前为止我遗漏了子序列的最后一个数字,这是我的代码:
def sequence_length1(array)
array.sort!
secuencia_mayor = []
array.each_with_index do |numero, indice|
numero + 1 == array[indice+1] ? secuencia_mayor << numero : ''
end
return secuencia_mayor
end
p sequence_length1([100, 4, 200, 1, 3, 2]) #length=4
p sequence_length1([29, 27, 28, 55, 100, 84]) #length=3
代码有一个错误:由于条件的原因,最后一个元素永远不会成为 secuencia_mayor 数组的一部分,我的问题是:我应该在代码中更改什么来克服这个问题?
非常感谢
要使用您采用的方法,您需要在遍历数组元素时保存迄今为止找到的最长已知序列(或其起始索引和长度)。这是一种方法。
def sequence_length1(array)
array.sort!
secuencia_mayor = []
candidate = []
array.each do |numero|
if candidate.empty? || candidate.last + 1 == numero
candidate << numero
else
secuencia_mayor = candidate.dup if candidate.size > secuencia_mayor
candidate = []
end
end
secuencia_mayor = candidate.dup if candidate.size > secuencia_mayor
secuencia_mayor
end
sequence_length1 [100, 4, 200, 1, 3, 2]
#=> [1, 2, 3, 4]
sequence_length1([29, 27, 28, 55, 100, 84]) #length=3
#=> [27, 28, 29]
另一种更Ruby-like的方法是使用Enumerable#slice_when and Enumerable#max_by.
def seq(arr)
arr.sort.slice_when { |a,b| b != a + 1 }.max_by(&:size)
end
seq [100, 4, 200, 1, 3, 2]
#=> [1, 2, 3, 4]
seq [29, 27, 28, 55, 100, 84]
#=> [27, 28, 29]
步骤如下
arr = [100, 4, 200, 1, 3, 2]
c = arr.sort
#=> [1, 2, 3, 4, 100, 200]
enum = c.slice_when { |a,b| b != a + 1 }
#=> #<Enumerator: #<Enumerator::Generator:0x00007fa9fd913238>:each>
d = enum.max_by(&:size)
#=> [1, 2, 3, 4]
我们可以看到 enum
将生成并通过将枚举器转换为数组传递给 max_by
的(三个)元素:
enum.to_a
#=> [[1, 2, 3, 4], [100], [200]]
enum.max_by(&:size)
是 shorthand 对于 enum.max_by { |e| e.size }
。
也可以使用 slice_when
的近亲 Enumerable#chunk_while:
[100, 4, 200, 1, 3, 2].sort.chunk_while { |a,b| b == a + 1 }.max_by(&:size)
#=> [1, 2, 3, 4]
大家好我正在研究最长子序列算法,我的想法是从数组中找到数字的子序列。我正在使用 Ruby,到目前为止我遗漏了子序列的最后一个数字,这是我的代码:
def sequence_length1(array)
array.sort!
secuencia_mayor = []
array.each_with_index do |numero, indice|
numero + 1 == array[indice+1] ? secuencia_mayor << numero : ''
end
return secuencia_mayor
end
p sequence_length1([100, 4, 200, 1, 3, 2]) #length=4
p sequence_length1([29, 27, 28, 55, 100, 84]) #length=3
代码有一个错误:由于条件的原因,最后一个元素永远不会成为 secuencia_mayor 数组的一部分,我的问题是:我应该在代码中更改什么来克服这个问题?
非常感谢
要使用您采用的方法,您需要在遍历数组元素时保存迄今为止找到的最长已知序列(或其起始索引和长度)。这是一种方法。
def sequence_length1(array)
array.sort!
secuencia_mayor = []
candidate = []
array.each do |numero|
if candidate.empty? || candidate.last + 1 == numero
candidate << numero
else
secuencia_mayor = candidate.dup if candidate.size > secuencia_mayor
candidate = []
end
end
secuencia_mayor = candidate.dup if candidate.size > secuencia_mayor
secuencia_mayor
end
sequence_length1 [100, 4, 200, 1, 3, 2]
#=> [1, 2, 3, 4]
sequence_length1([29, 27, 28, 55, 100, 84]) #length=3
#=> [27, 28, 29]
另一种更Ruby-like的方法是使用Enumerable#slice_when and Enumerable#max_by.
def seq(arr)
arr.sort.slice_when { |a,b| b != a + 1 }.max_by(&:size)
end
seq [100, 4, 200, 1, 3, 2]
#=> [1, 2, 3, 4]
seq [29, 27, 28, 55, 100, 84]
#=> [27, 28, 29]
步骤如下
arr = [100, 4, 200, 1, 3, 2]
c = arr.sort
#=> [1, 2, 3, 4, 100, 200]
enum = c.slice_when { |a,b| b != a + 1 }
#=> #<Enumerator: #<Enumerator::Generator:0x00007fa9fd913238>:each>
d = enum.max_by(&:size)
#=> [1, 2, 3, 4]
我们可以看到 enum
将生成并通过将枚举器转换为数组传递给 max_by
的(三个)元素:
enum.to_a
#=> [[1, 2, 3, 4], [100], [200]]
enum.max_by(&:size)
是 shorthand 对于 enum.max_by { |e| e.size }
。
也可以使用 slice_when
的近亲 Enumerable#chunk_while:
[100, 4, 200, 1, 3, 2].sort.chunk_while { |a,b| b == a + 1 }.max_by(&:size)
#=> [1, 2, 3, 4]