给定一个按递增顺序排序的整数数组 A,返回每个数字的平方组成的新数组,要求也按递增顺序排序。
示例 1:
输入:[-4,-1,0,3,10]
输出:[0,1,9,16,100]
示例 2:
输入:[-7,-3,2,3,11]
输出:[4,9,9,49,121]
提示:
1 <= A.length <= 10000
-10000 <= A[i] <= 10000
A 已按递增顺序排序。
思路与算法
最简单的方法就是将数组 A 中的数平方后直接排序。但这种方法没有利用「数组 A 已经按照升序排序」这个条件。显然,如果数组 A 中的所有数都是非负数,那么将每个数平方后,数组仍然保持升序;如果数组 A 中的所有数都是负数,那么将每个数平方后,数组会保持降序。
这样一来,如果我们能够找到数组 A 中负数与非负数的分界线,那么就可以用类似「归并排序」的方法了。
由于我们得到了两个已经有序的子数组,因此就可以使用归并的方法进行排序了。具体地,使用两个指针分别指向位置 i和 i-1 (i为第一个不为负的数的下标),每次比较两个指针对应的数,选择较小的那个放入答案并移动指针。当某一指针移至边界时,将另一指针还未遍历到的数依次放入答案。
Java代码:
public int