给你一个按?非递减顺序?排序的整数数组?nums
,返回?每个数字的平方?组成的新数组,要求也按?非递减顺序?排序。
示例 1:
输入:nums = [-4,-1,0,3,10] 输出:[0,1,9,16,100] 解释:平方后,数组变为 [16,1,0,9,100] 排序后,数组变为 [0,1,9,16,100]
示例 2:
输入:nums = [-7,-3,2,3,11] 输出:[4,9,9,49,121]
提示:
1 <= nums.length <= 104
-104 <= nums[i] <= 104
nums
?已按?非递减顺序?排序进阶:
O(n)
?的算法解决本问题1. 暴力法
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
for (int i = 0; i < nums.size(); i++) {
nums[i] = nums[i] * nums[i];
}
sort(nums.begin(),nums.end());
return nums;
}
};
2. 双指针
可以发现数组本身就是有序的,但是平方之后可能会无序,因为负数平方之后变成了正数,那么最大值还是只可能在最前面和最后面取到,我们可以定义两个指针,一个从前一个从后开始,比较大小,平方之后更大的加入到新数组的,注意,新数组是空数组,我们从后往前加,就不用最后再排序了。
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
vector<int> res(nums.size(),0);
int k = nums.size()-1;
for(int first = 0,last = nums.size()-1;first<=last;){
if(nums[first]*nums[first] < nums[last]*nums[last]){
res[k--] = nums[last]*nums[last];
last--;
}else{
res[k--] = nums[first]*nums[first];
first++;
}
}
return res;
}
};