977. 有序数组的平方
方法一:排序,将平方和的值升序排序。时间复杂度0(nlogn)
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
vector<int> v;
for(auto x:nums){
v.push_back(x*x);
}
sort(v.begin(),v.end());
return v;
}
};
方法二:双指针,[0,i]都是负数,[j,n-1]都是正数。时间复杂度0(n)。
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
vector<int> v;
int n=nums.size();
int i=0;
for(;i<n;i++){
if(nums[i]>=0){
i--;
break;
}
}
if(i==n) i--;
int j=i+1;
while(i>=0||j<n){
if(i<0){
v.push_back(nums[j]*nums[j]);
j++;
}else if(j==n){
v.push_back(nums[i]*nums[i]);
i--;
}else if(nums[i]*nums[i]<nums[j]*nums[j]){
v.push_back(nums[i]*nums[i]);
i--;
}else{
v.push_back(nums[j]*nums[j]);
j++;
}
}
return v;
}
};
方法三:双指针。这次是从找最大的开始。时间复杂度0(n)
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int n=nums.size();
vector<int> v(n);
int i=0,j=n-1;
int t=n-1;
while(i<=j){
if(nums[i]*nums[i]<=nums[j]*nums[j]){
v[t]=nums[j]*nums[j];
j--;
}else{
v[t]=nums[i]*nums[i];
i++;
}
t--;
}
return v;
}
};