思路
遇题不决,暴力求解,即方法一。
方法一:暴力求解
创建一个新数组,将每个数的平方赋给新数组,最后简单来个快排。
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int size = nums.size();
vector<int> retnum(size,0);
for(int i = 0;i<size;++i)
{
retnum[i] = nums[i]*nums[i];
}
sort(retnum.begin(),retnum.end());
return retnum;
}
};
此方法的时间复杂度为O(n+log2n),未达到进阶要求。
方法二:双指针法
暴力求解法没有利用好本题数组非递减顺序的特性,这里用双指针法进行优化。
创建一个和nums等大小的数组,由于对nums来说,数组平方的最大值只可能在数组的两个边界产生,我们用left和right来记录nums的左右边界,用end来记录retnums的尾,从后往前填充retnums
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
vector<int> retnum(nums.size(),0);
int end = retnum.size()-1;//记录retnum的右边界
int left = 0;//nums的左边界
int right = nums.size()-1;//nums的右边界
while(end>=0)
{
int max = 0;
if(nums[left]*nums[left]>nums[right]*nums[right])
{
//max为nums左右边界值的平方较大的一个,然后更新边界
max = nums[left]*nums[left];
left++;
}
else
{
max = nums[right]*nums[right];
right--;
}
retnum[end--] = max;//从后往前依次赋值
}
return retnum;
}
};