给定一个按非递减顺序排序的整数数组 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 已按非递减顺序排序。
解题思路:
第一个思路就是遍历整个数组,取出每个值平方放入另一个数组中,并进行排序,返回该数组即可。但是很明显,该方法的效率并不高,代码如下:
class Solution {
public:
vector<int> sortedSquares(vector<int>& A) {
vector<int> ans;
for(int i = 0; i < A.size(); i ++){
int num = A[i];
ans.push_back(num*num);
}
sort(ans.begin(),ans.end());
return ans;
}
};
第二种方法是个双指针的方法,也是特别好用的方法,而且执行效率高,使用两个指针分别指向位置 0 和 n−1,每次比较两个指针对应的数,选择较大的那个逆序放入答案并移动指针。这种方法无需处理某一指针移动至边界的情况,代码如下:
class Solution {
public:
vector<int> sortedSquares(vector<int>& A) {
int n = A.size();
vector<int> ans(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;
}
};