Ruby - 寻找子阵列之间的最大差异

时间:2014-09-22 20:48:19

标签: ruby arrays subsequence

我遇到了来自编码挑战网站的问题,该网站处理子序列。

给定一个整数元素数组,该数组的子序列是数组中的一组连续元素(即:给定数组v:[7,8,-3,5,-1],v的子序列是8,-3,5)

您的任务是编写一个函数,找到满足以下条件的数组的左子句和右子序列:

  1. 两个子序列必须是唯一的(它们没有共享元素)

  2. 右子序列中元素总和与左子序列中元素总和之间的差异是最大值

  3. 将差异打印到标准输出(标准输出)

  4. 该函数接收数组,这是一个整数数组。

    数据限制:

    1. 数组至少有2个,最多1,000,000个数字

    2. 数组中的所有元素都是以下范围内的整数:[ - 1000,1000]

    3. 实施例

      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
      

      但看起来不起作用。

1 个答案:

答案 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