题解一:
class Solution {
public:
// 可以直接原地将数组元素平方,然后从小到大进行排序
vector<int> sortedSquares(vector<int>& A) {
for(int i=0;i<A.size();i++){
A[i]=A[i]*A[i];
}
sort(A.begin(),A.end());
return A;
}
};
题解二:双指针
class Solution {
public:
// 1.先找到数组绝对值最小的位置(p1,p2),p1表示负数的结束,p2表示正数的开始
// 2.然后分别从最小值的位置向两端遍历
vector<int> sortedSquares(vector<int>& A) {
int p1,p2;
int n=A.size();
vector<int> result;
for(int i=0;i<n;i++){
if(A[i]<0){
p1=i;
}else{
break;
}
}
// 上面循环结束就是p2在正数的位置
p2=p1+1;
while(true){
if(p1>-1 && p2<n){
if(A[p1]*A[p1] < A[p2]*A[p2]){
result.push_back(A[p1]*A[p1]);
p1--;
}else{
result.push_back(A[p2]*A[p2]);
p2++;
}
}
else if(p1<0 && p2<n){
result.push_back(A[p2]*A[p2]);
p2++;
}
else if(p1>-1 && p2>=n){
result.push_back(A[p1]*A[p1]);
p1--;
}
else{
break;
}
}
return result;
}
};