【问题标题】:Rearrange odd and even numbers重新排列奇数和偶数
【发布时间】:2016-06-13 01:55:55
【问题描述】:

是否有一个 O(n) 算法来重新排列奇数和偶数并保持顺序?辅助数组可用于中间结果,但重排应在数组内完成。

我发现这个http://www.geeksforgeeks.org/segregate-even-and-odd-numbers/ 可以做需要做的事情,但它不能维持秩序

Input:
1 4 3 8 6 5 7

Output:
1 3 5 7 4 8 6 

【问题讨论】:

  • 输入总是排序的吗?如果不是,那么就不可能完成 O(n)
  • 你为什么要问“那里...”?你知道有一个吗?你需要一个吗?
  • 数列是任意的吗?如果是这样,请在您的示例中反映这一点,因为您提出的方式会使读者感到困惑。
  • 是的,数字顺序是任意的。我想知道是否有办法在两遍算法中做到这一点。因为总体复杂度仍然是 O(n)。辅助数组可用于中间结果,但重排应在数组内完成

标签: algorithm complexity-theory divide-and-conquer


【解决方案1】:

这个怎么样?

  1. 创建两个双向链表(或具有 O(1) 级联的东西)以分别存储奇数和偶数。
  2. 遍历输入列表,将它们分离到步骤 1 中的列表。
  3. 连接两个列表。

【讨论】:

  • 您的第三步应该是“从列表的内容中填充数组”。但是,如果您不必这样做,那么使用真正的链表会很痛苦......
  • @Amit ,我想这取决于;我发现链接数据结构更容易推理。它还取决于编程语言,像 Haskell 这样的纯函数式语言可能更喜欢链表而不是数组。
  • 我认为问题是关于数组(输入和输出),但实际上它并没有说明什么。它确实说(现在,编辑后)没有辅助数组,所以我想这意味着你的答案也无效。但是,使用链表,您不需要任何辅助结构,只需将项目移动到正确的位置即可。这是O(n)
  • @Amit,对,如果问题需要数组,我的答案有额外的 O(n) 内存要求,而不是 O(1) 的链表。但这仍然是 O(n) 时间复杂度。
猜你喜欢
  • 1970-01-01
  • 2020-10-17
  • 2016-04-25
  • 2018-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多