题目链接:
https://leetcode-cn.com/problems/squares-of-a-sorted-array/
难度:简单
977. 有序数组的平方
给定一个按非递减顺序排序的整数数组 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 已按非递减顺序排序。
三个方向吧。。。
使用sort函数, 最好别这样。。。
class Solution {
public:
vector<int> sortedSquares(vector<int>& A) {
int n=A.size();
vector<int> res(n);
int i=0;
for(int &a:A){
res[i++]=a*a;
}
sort(res.begin(),res.end());
return res;
}
};
双指针中间向两侧
class Solution {
public:
vector<int> sortedSquares(vector<int>& A) {
int n=A.size();
vector<int> res(n);
int i=0;
for(;i<n;){
// 注意 >= = 很关键一开始没注意
if(i+1<n&&abs(A[i])>=abs(A[i+1])){
i++;
}else{
break;
}
}
int j=i+1;
int k=0;
while(j<n&&i>=0){
if(abs(A[i])<abs(A[j])){
res[k]=A[i]*A[i];
i--;
}else{
res[k]=A[j]*A[j];
j++;
}
k++;
}
if(j<n){
while(j<n){
res[k++]=A[j]*A[j];
j++;
}
}else if(i>=0){
while(i>=0){
res[k++]=A[i]*A[i];
i--;
}
}
return res;
}
};
双指针两侧向中间靠拢
class Solution {
public:
vector<int> sortedSquares(vector<int>& A) {
int n=A.size();
vector<int> res(n);
int i=0,j=n-1,k=n-1;
while(i<j){
if(A[i]*A[i]>=A[j]*A[j]){
res[k--]=A[i]*A[i];
i++;
}else{
res[k--]=A[j]*A[j];
j--;
}
}
res[0]=A[j]*A[j];
return res;
}
};