题目描述
给定一个按非递减排序的整形数组A,返回每个数字的平方组成的新数组,要求也按非递减顺序排序
示例1
输入:[-4,-1,0,3,10]
输出:[0,1,9,16,100]
解题思路:
方法一:先将原始序列按绝对值大小排序,然后逐元素求平方
static bool cmp(int a,int b){
return abs(a)<abs(b);
}
vector<int> sortedSquares(vector<int>& A) {
sort(A.begin(),A.end(),cmp);
for(int i=0;i<A.size();i++) A[i] = A[i]*A[i];
return A;
}
方法二:使用two_pointer方法,先找到第一个大于等于0的位置,又该位置向两边移动,将较小的平方数放入新数组
static int low_bound(vector<int>& A,int x){
int i = 0,j = A.size() - 1;
while(i < j){
int mid = (i + j) / 2;
if(A[mid] >= x) j = mid;
else i = mid + 1;
}
return i;
}
vector<int> sortedSquares(vector<int>& A) {
int j = low_bound(A,0);
int i = j-1,len = A.size();
vector<int> ans;
while(i >= 0 && j < len){
if(abs(A[i]) > abs(A[j])){
ans.push_back(A[j]*A[j]);
j++;
}else{
ans.push_back(A[i]*A[i]);
i--;
}
}
while(i>=0){
ans.push_back(A[i]*A[i]);
i--;
}
while(j<len){
ans.push_back(A[j]*A[j]);
j++;
}
return ans;
}