题目:
给你一个按 非递减顺序 排序的整数数组 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]
方法一:暴力法
先将nums中的数字都进行平方,然后再排序
在进行平方的过程中的时间复杂度为O(n)
排序时的时间复杂度为O(nlog n );
这个程序的总共的时间复杂度为O(n+nlogn);
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int size=nums.size();
//将数组平方
for(int i=0;i<size;i++){
nums[i]=nus[i]*nums[i];
}
//进行快速排序
sort(nums.begin(),nums.end());
return nums;
}
};
方法2:双指针法
定义两个指针,一个指针p1指向nums的首元素,一个指针p2指向nums的最后一个元素
[-4,-1,0,3,10] nums数组是按照从小到大的顺序排列,所以最大的元素只会出现在nums的首元素和最后一个元素上。
nums的元素个数:len =nums.size();
创建一个新的数组result[]用来存储排好序后的元素: result[len]
如果nums[p1]的平方>nums[p2]的平方:将nums[p1]存入到result中,将指针p1向右移一位,
如果nums[p2]的平方>nums[p1]的平方:将nums[p2]存入到result中,将指针p2向左移一位,
如果nums[p2]的平方==nums[p1]的平方:将nums[p2],nums[p1]都存入到result中,指针p2和指针p1同时移动,将指针p2向左移位,将指针p1向右移一位;
循环执行上面的步骤,直到p1==p2。
这个的时间复杂度为O(n);
代码:
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int size=nums.size();
//开辟空间与nums的长度相同
vector<int> result(size);
//result中的最后元素的索引
int len=size-1;
int p1=0;
int p2=size;
while(p1<p2){
if(nums[p1]*nums[p1]>nums[p2]*nums[p2]){
result[len]=nums[p1]*nums[p1];
len--;
p1++;
}else if(nums[p1]*nums[p1]<nums[p2]*nums[p2]){
result[len]=nums[p2]*nums[p2];
len--;
p2--;
}else{
result[len]=nums[p1]*nums[p1];
len--;
p1++;
result[len]=nums[p2]*nums[p2];
len--;
p2--;
}
}
//循环退出后p1和p2指向相同的元素,这个元素最小,放在数组result的0索引上
result[0]=nums[p1]*nums[p1];
return result;
}
};