给定一个按非递减顺序排序的整数数组 A,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。
方法一:直接排序
将数组 AA 中的数平方后直接排序。
class Solution {
public int[] sortedSquares(int[] A) {
int[] ans = new int[A.length];
for (int i = 0; i < A.length; ++i) {
ans[i] = A[i] * A[i];
}
Arrays.sort(ans);
return ans;
}
}
复杂度分析
时间复杂度:O(nlogn),其中 nn 是数组 AA 的长度。
空间复杂度:O(logn)。除了存储答案的数组以外,我们需要O(logn) 的栈空间进行排序。
方法二:双指针
同样地,我们可以使用两个指针分别指向位置 00 和 n-1n−1,每次比较两个指针对应的数,选择较大的那个逆序放入答案并移动指针。这种方法无需处理某一指针移动至边界的情况,读者可以仔细思考其精髓所在。
简单说,就是对比左右两端哪个平方大,就把哪个放在新数组最大的位置,再往前或往后退一位与对面那个比较。
class Solution {
public int[] sortedSquares(int[] A) {
int n = A.length;
int[] ans = new int[n];
for (int i = 0, j = n - 1, pos = n - 1; i <= j;) {
if (A[i] * A[i] > A[j] * A[j]) {
ans[pos] = A[i] * A[i];
++i;
} else {
ans[pos] = A[j] * A[j];
--j;
}
--pos;
}
return ans;
}
}
复杂度分析
时间复杂度:O(n),其中 nn 是数组 AA 的长度。
空间复杂度:O(1)。