方法一:暴力法,平方后排序
vector<int> sortedSquares(vector<int> &nums) {
for (int i = 0; i < nums.size(); ++i) {
nums[i] = abs(nums[i]);
}
sort(nums.begin(),nums.end(), cmp);
for (int i = 0; i < nums.size(); ++i) {
nums[i] = pow(nums[i],2);
}
return nums;
}
时间复杂度:O(n + nlogn)
方法二:双指针
数组是有序的,负数平方会变正,所以数组中元素平方的最大值一定是在数组的两端的。
使用空间换时间,申请新的数组。
old数组用两个指针,分别从两端开始。
new数组用一个指针,从最右端开始。
比较old数组两个指针位置上元素的平方大小,大的那一个放进new数组右边。
然后old指针往更小元素移动,new指针往左移一格。
vector<int> sortedSquares(vector<int> &nums) {
vector<int> vec(nums.size(),0);
int l = 0,r = nums.size() - 1;
int idx = vec.size() - 1;
//i从最右边开始,往左移动
for (int i = idx; i >= 0 ; i--) {
//左边大的话,就把左边赋值给vec[i]
if(pow(nums[l],2) >= pow(nums[r],2)) {
vec[i] = pow(nums[l],2);
l++;
} else {
vec[i] = pow(nums[r],2);
r--;
}
}
return vec;
}