【问题标题】:Find two maximum deltas in array with non intersecting indices在具有非相交索引的数组中找到两个最大增量
【发布时间】:2023-02-09 04:42:48
【问题描述】:

假设我们有数组:[1, 1, 3, 10, 11, 2, 9]。 我无法通过 google/stackoveflow/figure 找出可以: 在给定数组中找到两对数字 [n1, n2] 和 [m1, m2],它们的比率 max( (n2/n1) + (m2/m1) ) 的最大总和使得:

  1. n1 <= n2, m1<=m2
  2. 指数(n1)<指数(n2)<指数(m1)<指数(m2)。 在给定的示例中:我们有 [1(n1), 1, 3, 10, 11(n2), 2(m1), 9(m2)]。 我们不能有其他 1 和 10,因为它们将在数组中的 n1 和 n2 之间。

    我目前的想法:

    1. 查找最小值和最大值,例如 index(min) < index(max)。

    2. 在它们之间找到另一对最小值和最大值,例如 index(max) < index(min)

      但无法弄清楚如何证明这就是我正在寻找的东西。还是有另一种方法?

【问题讨论】:

    标签: arrays algorithm


    【解决方案1】:

    假设我不知道您寻求的算法的目的是什么,我可能会按以下方式进行:

    # Get max
    m2 = max [ 0, A.length ) 
    
    # Get max on array to m2 index
    n2 = max [ 0, index(m2) ) 
    
    # So: 
    index(n2) < index(m2) 
    
    # Get min on array from n2 to m2 index
    m1 = min ( index(n2), index(m2) ) 
    
    # Get min on array from 0 to n2 index
    n1 = min ( 0, index(n2)  ) 
    
    # So: 
    index(n1) < index(n2) < index(m1) < index(m2)
    

    在分子处具有两个最大值且在分母处具有两个最小值的比率之和在数学上保证为最大。

    但是,可能会出现您没有足够的剩余索引来查找 4 个不同数字的情况。 如果 4 个相等的数字不是一个可接受的解决方案,那么,您必须再次执行相同的过程,丢弃在第一步中找到的绝对最大值,并寻找另一个具有更大索引的数字,依此类推。

    【讨论】:

      【解决方案2】:

      这是一个非常简单的问题,基本上只是将数组分成两个子数组并找到每个子数组的最大值和最小值。然而,问题变成了我们在哪里拆分原始数组以获得最大和。使用蛮力可以轻松找到最佳位置。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-10-05
        • 1970-01-01
        • 1970-01-01
        • 2016-06-11
        • 1970-01-01
        • 1970-01-01
        • 2016-07-01
        相关资源
        最近更新 更多