由于数组 A 已经按照非递减顺序排序,那么 A 数组中绝对值较大的数一定在数组两端,绝对值较小的数一定在数组中间。因此我们可以使用双指针来解决这道问题,具体地,我们使用两个指针 l 和 r 分别指向数组 A 的最小值和最大值,然后比较 A[l] 和 A[r] 的绝对值大小,将较大的数平方并放入结果数组的末尾,并向中间靠拢指针。重复上述操作,直到 l > r 时停止。
需要注意的是,当 A[l] 和 A[r] 的绝对值相等时,我们需要先将 A[r] 平方再放入结果数组的末尾,并将 r 向左移动一位。这样做的原因是,当 A[l] 和 A[r] 的绝对值相等时,如果先将 A[l] 平方放入结果数组的末尾并将 l 向右移动一位,可能会使得平方后的 A[l] 大于平方后的 A[r],从而破坏了结果数组的非递减顺序。
class Solution {
public:
vector<int> sortedSquares(vector<int>& A) {
int n = A.size();
int l = 0, r = n - 1;
vector<int> res(n);
int k = n - 1;
while (l <= r) {
if (abs(A[l]) >= abs(A[r])) {
res[k--] = A[l] * A[l];
l++;
} else {
res[k--] = A[r] * A[r];
r--;
}
}
return res;
}
};