题目描述
给定一个按非递减顺序排序的整数数组 A,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。
示例 1:
输入:[-4, -1, 0, 3, 10]
输出:[0, 1, 9, 16, 100]
示例 2:
输入:[-7, -3, 2, 3, 11]
输出:[4, 9, 9, 49, 121]
双指针
最简单的方法,我们可以将数组中的元素全部求平方,然后进行排序即可,但是这样操作空间复杂度和时间复杂度都较大,在此我们不多做赘述。我们观察数组的特性可以发现,数组是排序好的,这样我们就可以使用一个比较巧妙的方法进行计算,具体的,对于全正数的数组,直接平方后即满足题意,但是有负数的情况下,负数中越小的负数,计算的结果越大。正数中越大的正数计算的结果越大,题目要求平方后的数组依然是非递减顺序排序,于是我们可以定义两个指针分别指向 0 和 len - 1。不断的移动这两个指针,每次我们将平方后的较大的值逆序的放入数组中。最后完成计算,结果也将是非递减顺序。
1 | public int[] sortedSquares(int[] A) { |
复杂度分析
- 时间复杂度:O(n),其中 n 是数组 A 的长度。
- 空间复杂度:O(1)。