【问题标题】:Find the shortest sequence length out from list of arrays which should contain element from each array从应该包含每个数组元素的数组列表中找出最短的序列长度
【发布时间】:2016-01-22 21:22:13
【问题描述】:

这里有个问题:

假设我们有以下数组:

[1,2,9]
[3,6,7]
[4,11]
[8,10,12]

数组中的项目是唯一且有序的。任务是找到最短的序列长度,其中至少包含每个数组的一个元素,但这些元素应该一个接一个(没有间隙,不能是 [1,3])并且也是有序的。所以在这种情况下,答案是:

5 => [7,8,9,10,11]

有没有有效的方法来做到这一点?

【问题讨论】:

    标签: arrays algorithm minimum


    【解决方案1】:

    你可能会使用两个指针算法(抱歉我没有找到任何参考)。复杂度是O(nlogn)n是所有数组中元素的总和。

    首先,将所有元素放入一维数组中,并使用数组索引捐赠每个元素。就这样,

    struct A{
        int value;
        int array_id;
    };
    

    然后,按值对元素进行排序(O(nlogn))。我们的问题发生了变化,以找到覆盖所有数组的最短连续序列。这可以通过两个指针算法来完成。复杂度为O(n)

    所以总复杂度是O(nlogn)

    【讨论】:

      【解决方案2】:

      这可以通过以下方式轻松解决。

      1. 列表项
      2. 将 minimum_range 初始化为 MAX_INT
      3. 保留 3 个指针/索引 p1、p2 和 p3,它们分别指向列表 L1、L2 和 L3 的第一个元素。
      4. 找到p1、p2和p3指向/索引的最大值和最小值
      5. 步骤 3 中发现的最大值和最小值之差是当前范围。将其与 minimum_range 进行比较并更新它,如果发现更小。
      6. 增加第 3 步中找到的最小值的指针/索引。
      7. 重复步骤 3 到 5,直到最小值的指针/索引在范围内。

      另请查看this 讨论。这是关于你的问题。 在那里你也可以找到 c++ 和 java 代码

      【讨论】:

      • 我唯一想提的是使用最小二进制堆并且不确定数组的确切数量,假设有n个数组
      猜你喜欢
      • 1970-01-01
      • 2018-01-16
      • 1970-01-01
      • 2019-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-17
      • 1970-01-01
      相关资源
      最近更新 更多