【发布时间】:2012-01-28 19:29:00
【问题描述】:
面试题:
给定两个无序整数序列
a和b,它们的大小为n,所有 数字随机选择:交换a和b的元素,使得a的元素之和减去b的元素之和最小。
举个例子:
a = [ 5 1 3 ]
b = [ 2 4 9 ]
结果是 (1 + 2 + 3) - (4 + 5 + 9) = -12。
我的算法:将它们排序在一起,然后将第一个最小的 n 整数放入 a 并留在 b 中。它在时间上是 O(n lg n),在空间上是 O(n)。我不知道如何将其改进为时间 O(n) 和空间 O(1) 的算法。 O(1) 意味着我们不需要更多额外的空间,除了 seq 1 和 2 本身。
有什么想法吗?
另一个问题是:如果我们需要最小化差异的绝对值(最小化|sum(a) - sum(b)|)怎么办?
Python 或 C++ 思维者优先。
【问题讨论】:
-
听起来像是功课。如果是这样,请相应地标记。
-
如果考虑原始的 a 和 b 列表,它在空间中不可能是 O(1)。如果您不考虑它们,则只需直接交换值。无论哪种情况,请在问题中提供更多详细信息。
-
@GaretJax,如何在 O(n) 时间内高效地进行交换?
-
只需对单个元素使用单个临时变量(O(1) 空间)并遍历列表(O(n) 时间)。
-
-1 “交换 a 和 b 的元素”非常模糊——我在答案中发现了大约 2.01 种对此的理解。
标签: c++ python algorithm data-structures