题目描述

双指针法一
用right表示原数组中负数和非负数的分界线。
nums[0,right-1]的是负数,nums[right,nums.size()-1]是非负数。
然后用合并两个有序数组的方法。合并即可。
cpp
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
vector<int> res;
int len = nums.size();
res.reserve(len);
int right = -1;
for(int i =0;i <len;i++){
if(right == -1 && nums[i] >=0)
right = i;
nums[i] = nums[i]*nums[i];
}
int left = right-1;
if(right == -1){
right = len;
left = len -1;
}
while(left >= 0 && right < len){
if(nums[left]<=nums[right]){
res.push_back(nums[left--]);
}else{
res.push_back(nums[right++]);
}
}
while(left>=0){
res.push_back(nums[left--]);
}
while(right<len){
res.push_back(nums[right++]);
}
return res;
}
};
双指针法二
容易发现原数组中元素的绝对值从两端向中间减小。因此可以逆序确定res数组。
cpp
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int len = nums.size();
vector<int> res(len,0);
int left = 0;
int right = len -1;
int res_pos = len - 1;
while(left <= right){
if(abs(nums[left]) > abs(nums[right])){
res[res_pos--] = nums[left]*nums[left];
left++;
}else{
res[res_pos--] = nums[right]*nums[right];
right--;
}
}
return res;
}
};