leetcode 977. 有序数组的平方
法一:双指针,先找负数与非负数的边界
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
vector<int> res;
if(nums[0] >= 0){//全部非负的情况
for(int &num : nums) res.emplace_back(num*num);
return res;
}
int size = nums.size();
if(nums[size-1] <= 0){//全部非正的情况
for(int i = size-1;i >= 0;--i) res.emplace_back(nums[i]*nums[i]);
return res;
}
int flag;
for(int i = 1;i < size;++i){
if(nums[i] >= 0){
flag = i;break;
}
}
int i = flag-1,j = flag;
while(i >= 0 && j <= size-1){
while(i >= 0 && j <= size-1 && abs(nums[i]) < abs(nums[j])){
res.emplace_back(nums[i]*nums[i]);--i;
}
while(i >= 0 && j <= size-1 && abs(nums[i]) >= abs(nums[j])){
res.emplace_back(nums[j]*nums[j]);++j;
}
}
while(i >= 0){
res.emplace_back(nums[i]*nums[i]);--i;
}
while(j <= size-1){
res.emplace_back(nums[j]*nums[j]);++j;
}
return res;
}
};
法二:不需要找非负边界,直接逆序放入res
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int size = nums.size();
vector<int> res(size);
int i = 0, j = size - 1;
for (int p = size - 1; p >= 0; p--) {
//将绝对值更大的先倒着放进res
if(abs(nums[i]) > abs(nums[j])) {
res[p] = nums[i]*nums[i];
++i;
} else{
res[p] = nums[j]*nums[j];
j--;
}
}
return res;
}
};