【发布时间】:2018-03-28 19:12:10
【问题描述】:
给定一个按排序顺序排列的整数列表,例如[-9, -2, 0, 2, 3],我们必须对每个元素求平方并以排序顺序返回结果。因此,输出将是:[0, 4, 4, 9, 81]。
我可以想出两种方法:
O(NlogN)方法 - 我们将每个元素的平方插入哈希集中。然后将元素复制到列表中,排序然后返回。O(n)方法 - 如果输入元素有一个界限(比如 -100 到 -100),那么我们创建一个大小为 20000 的布尔列表(存储 -10000 到 10000)。对于每个输入元素,我们将相应的平方数标记为真。例如,对于输入中的9,我将布尔数组中的81标记为真。然后遍历这个布尔列表,将所有真正的元素插入一个返回列表。请注意,在此我们做了一个假设 - 输入元素有一个界限。
有没有什么方法可以让我们在O(n) 时间内做到这一点即使不假设输入有任何界限?
【问题讨论】:
-
找到符号变化,将值平方,将列表解释为两个排序列表,然后merge them。那将是 O(n)。
-
@WarrenWeckesser,您能详细说明一下吗?
-
@J.Doe 以您的示例
[-9, -2, 0, 2, 3]为例,将其解释为[-9, -2]、[0, 2, 3](负数;非负数)。平方两个列表。[81, 4],[0, 4, 9]。逆向走第一个列表,正常走第二个列表,然后将它们合并。 :) -
@Max,很有趣!我想知道为什么我没有想到那个。 :)
-
另一种实现方式是在比较 abs(L[left]) 和 abs(L[right]) 后使用
deque.appendleft并决定放入哪个,并递增。左或右指针...(类似于@Lavina Khushlani 提到的。