给定排序顺序的整数列表,比如[-9, -2, 0, 2, 3]
,我们必须对每个元素求平方并按排序顺序返回结果。因此,输出将是:[0, 4, 4, 9, 81]
。
我可以找出两种方法:
O(NlogN)
方法 - 我们在hashset中插入每个元素的平方。然后将元素复制到列表中,对其进行排序,然后将其返回。
O(n)
方法 - 如果输入元素有一个界限(比如-100到-100),那么我们创建一个大小为20000的布尔列表(用于存储-10000到10000)。对于每个输入元素,我们将相应的平方数标记为true。例如,对于输入中的9
,我将布尔数组中的81
标记为true。然后遍历此布尔列表并将所有true元素插入到返回列表中。请注意,在此我们假设 - 输入元素有一个界限。
我们是否可以在O(n)
时间中执行此操作,即使不假设任何输入界限?
答案 0 :(得分:2)
我能想到O(n)
方法
A
。一个正数和0,列出B
。这是在保留输入顺序的同时完成的,这很简单:O(n)
A
。我们这样做是因为一旦平方,如果翻转了元素之间的关系大于O(n)
merge
操作,与合并排序不同。 :O(n)
O(n)
完成:)
答案 1 :(得分:1)
有没有办法在O(n)时间内完成它,即使没有假设任何输入界限?
绝对。
由于原始列表已经排序,您很幸运!
给出两个数字x和y
如果|x| > |y|
则x^2 > y^2
所以你要做的就是将列表分成两部分,一部分用于所有负数,另一部分用于所有正数
反转否定的一方并使其成为正面
然后使用插入将这两个列表合并为一个。这在O(n)
中运行,因为两个列表都已排序。
从那里你可以计算出方块并将它们放入新的列表中。
答案 2 :(得分:1)
我们可以通过2指针技术来实现。在开始处有1个指针,在结束处有1个指针。比较平方并相应地移动指针,并开始在新列表的末尾分配max元素。 时间= O(n) 空间= O(n)
您可以就地执行吗?为了减少空间复杂度。
答案 3 :(得分:1)
这可以用O(n)的时间和空间来完成。我们需要两个指针。以下是Java代码:
public int[] sortedSquares(int[] A) {
int i = 0;
int j = A.length - 1;
int[] result = new int[A.length];
int count = A.length - 1;
while(count >= 0) {
if(Math.abs(A[i]) > Math.abs(A[j])) {
result[count] = A[i]*A[i];
i++;
}
else {
result[count] = A[j]*A[j];
j--;
}
count--;
}
return result;
}
从结束广告开始比较绝对值。然后创建答案。