给定一个按非递减顺序排序的整数数组 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) {
for_each(A.begin(), A.end(), [](int& x){ x = x * x;});
sort(A.begin(), A.end());
return A;
}
};
方法二
class Solution {
public:
vector<int> sortedSquares(vector<int>& A) {
int start = 0;
int end = A.size() - 1;
int pos = end;
vector<int> result(A.size(),0);
int startValue = 0;
int endValue = 0;
while (start <= end) {
startValue = A[start] * A[start];
endValue = A[end] * A[end];
if (startValue > endValue) {
result[pos--] = startValue;
++start;
} else {
result[pos--] = endValue;
--end;
}
}
return result;
}
};
方法二每次循环要计算2次平方,平方总是要计算的,也可以先计算。性能是否有提升呢? 先计算后,区别就是如何排序了。
class Solution {
public:
vector<int> sortedSquares(vector<int>& A) {
for_each(A.begin(), A.end(), [](int& x){ x = x * x;});
int start = 0;
int end = A.size() - 1;
int pos = end;
vector<int> result(A.size(),0);
while (start <= end) {
if (A[start] > A[end]) {
result[pos--] = A[start];
++start;
} else {
result[pos--] = A[end];
--end;
}
}
return result;
}
};