参考网址:代码随想录
一、暴力排序
思路:逐个平方之后排序。
代码:
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
for(int i=0;i<nums.size();i++){
nums[i]*=nums[i];
}
sort(nums.begin(),nums.end());
return nums;
}
};
二、双指针法
思路:当原数组内元素平方之后,负数的平方可能成为最大值,最大值不是在最左侧就是在最右侧,这时考虑使用双指针,i指向起始位置,j指向末端位置。
创建与nums数组相同大小的result数组,并定义k指向result数组末端位置。
如果i位置元素平方小于j位置元素平方,则最大值在最右侧,将j对应元素平方赋值给result[k];否则,最大值在最左侧,将i对应元素平方赋值给result[k],赋值后记得移动对应下标。
代码:
class Solution {
public:
vector<int> sortedSquares(vector<int>& A) {
int k = A.size() - 1;
vector<int> result(A.size(), 0);
for (int i = 0, j = A.size() - 1; i <= j;) {
// 注意这里要i <= j,因为最后要处理两个元素
if (A[i] * A[i] < A[j] * A[j]) {
result[k--] = A[j] * A[j];
j--;
}
else {
result[k--] = A[i] * A[i];
i++;
}
}
return result;
}
};