O(n)列表中的数字排序方块?

时间:2018-03-28 19:12:10

标签: algorithm time-complexity

给定排序顺序的整数列表,比如[-9, -2, 0, 2, 3],我们必须对每个元素求平方并按排序顺序返回结果。因此,输出将是:[0, 4, 4, 9, 81]

我可以找出两种方法:

  1. O(NlogN)方法 - 我们在hashset中插入每个元素的平方。然后将元素复制到列表中,对其进行排序,然后将其返回。

  2. O(n)方法 - 如果输入元素有一个界限(比如-100到-100),那么我们创建一个大小为20000的布尔列表(用于存储-10000到10000)。对于每个输入元素,我们将相应的平方数标记为true。例如,对于输入中的9,我将布尔数组中的81标记为true。然后遍历此布尔列表并将所有true元素插入到返回列表中。请注意,在此我们假设 - 输入元素有一个界限。

  3. 我们是否可以在O(n)时间中执行此操作,即使不假设任何输入界限

4 个答案:

答案 0 :(得分:2)

我能想到O(n)方法

  1. 将输入拆分为2个列表。一个负数,我们称之为A。一个正数和0,列出B。这是在保留输入顺序的同时完成的,这很简单:O(n)
  2. 反向列表A。我们这样做是因为一旦平方,如果翻转了元素之间的关系大于
  3. 对两个列表中的每个项目进行平方:O(n)
  4. 运行merge操作,与合并排序不同。 :O(n)
  5. 总计:O(n)
  6. 完成:)

答案 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;
}

从结束广告开始比较绝对值。然后创建答案。