我遇到了来自编码挑战网站的问题,该网站处理子序列。
给定一个整数元素数组,该数组的子序列是数组中的一组连续元素(即:给定数组v:[7,8,-3,5,-1],v的子序列是8,-3,5)
您的任务是编写一个函数,找到满足以下条件的数组的左子句和右子序列:
两个子序列必须是唯一的(它们没有共享元素)
右子序列中元素总和与左子序列中元素总和之间的差异是最大值
将差异打印到标准输出(标准输出)
该函数接收数组,这是一个整数数组。
数据限制:
数组至少有2个,最多1,000,000个数字
数组中的所有元素都是以下范围内的整数:[ - 1000,1000]
实施例
Input: 3, -5, 1, -2, 8, -2, 3, -2, 1
Output: 15
在上面的例子中,左子序列是[-5,1,-2],右子序列是[8,-2,3]
(8 + -2 + 3) - (-5 + 1 + -2) = 9 - -6 = 15
这是我尝试过的事情
def maximum_difference(array)
sequences = array.each_cons(3).to_a
pairs = sequences.each_cons(2).to_a
pairs.select{|pair|pair[0]+pair[1].length != pair[0] + pair[1].uniq.length}
pairs.map{|values|values.reduce(:+)}.sort{|max, min| max - min}
end
但看起来不起作用。
答案 0 :(得分:3)
我所做的是对数组分区的条件,使得“左”和“右”数组都包含至少一个元素。对于每个分区,我然后在左边的数组中找到其总和最小的序列,在右边的数组中找到总和最大的序列,并最大化所有分区的差异。
<强>代码强>
def largest_diff(arr)
(arr.size-2).times.map { |n|
[min_sub(arr[0..n]), max_sub(arr[n+1..-1])] }.max_by { |l,r|
r.reduce(:+) - l.reduce(:+) }
end
private
def max_sub(arr)
max_min_sub(arr, :max_by)
end
def min_sub(arr)
max_min_sub(arr, :min_by)
end
def max_min_sub(arr, max_min_by)
(1..arr.size).map { |i| arr.each_cons(i).send(max_min_by) { |b|
b.reduce(:+) } }.send(max_min_by) { |b| b.reduce(:+) }
end
示例强>
arr = [3, -5, 1, -2, 8, -2, 3, -2, 1]
seq = (arr.size-2).times.map { |n|
[min_sub(arr[0..n]), max_sub(arr[n+1..-1])] }.max_by { |l,r|
r.reduce(:+) - l.reduce(:+) }
#=> [[-5, 1, -2], [8, -2, 3]]
seq.last.reduce(:+) - seq.first.reduce(:+)
#=> 15