【问题标题】:split an array which comtains partially relatively order into two sorted array in O(n) time在 O(n) 时间内将包含部分相对顺序的数组拆分为两个排序数组
【发布时间】:2023-01-19 01:33:23
【问题描述】:

假设我有两个数组,它们都已排序,例如:

A: [1, 4, 5, 8, 10, 24]

B: [3, 6, 9, 29, 50, 65]

然后我将这两个数组合并为一个数组并保持两个数组的原始相对顺序

C: [1, 4, 3, 5, 6, 9, 8, 29, 10, 24, 50, 65]

有没有办法在 O(n) 时间内将 C 拆分为两个排序数组?

注意:不一定要变成原来的A和B

【问题讨论】:

  • 有一些方法可以将它们拆分,但在没有更多信息的情况下不一定要拆分为原始的 AB。例如,在上面的示例中,我们最终可能会得到 [1,4,5,6,9,29][3,8,10,24,50,65] 作为可能的拆分,等等。
  • 是的,不一定变成原来的A和B,你能给我提示吗?
  • 两个排序数组是否严格递增(所有元素都不同)?
  • 是的,您可以假设两个原始数组严格递增
  • 贪婪的方法会起作用:对于C 中的每个元素,尝试将其放入第一个排序数组中。如果不能,则该元素必须进入第二个排序数组。这个方案有效,但证明为什么会很有趣。

标签: algorithm sorting split


【解决方案1】:

让我们以你的例子为例。

[1, 4, 3, 5, 6, 9, 8, 29, 10, 24, 50, 65]

及时O(n)你可以算出尾巴的最小值。

[1, 3, 3, 5, 6, 8, 8, 10, 10, 24, 50, 65]

现在一个流是所有最小值的情况,另一个是不是最小值的情况。

[1,    3, 5, 6,    8,     10, 24, 50, 65]
[   4,          9,    29,               ]

这一切都是及时O(n) 可以做到的。

我们可以更进一步,现在根据第一个流中的哪些值在不改变它增加的情况下可以在最后一个流中消失,分成 3 个流。

[      3, 5, 6,    8,     10, 24,       ]
[1,       5, 6,    8,             50, 65]
[   4,          9,    29,               ]

现在我们可以开始列举 2^6 = 64 将原始流拆分回 2 个递增流的不同方法。

【讨论】:

    【解决方案2】:

    贪婪地将你的整数分配给列表 1,如果它们可以去那里的话。如果他们不能,将他们分配到列表 2。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-12
      • 1970-01-01
      • 2016-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多