一、题目
二、解题思路
先给每一个数平方(包括负数),在排序,此方法的时间复杂度根据排序的时间复杂度确定,如果为冒泡则为O(n+n^2),如果为快排则为O(n+nlogn)
int* sortedSquares(int* nums, int numsSize, int* returnSize)
{
int *ar=(int*)malloc(sizeof(int)*numsSize);
for(int i=0;i<numsSize;i++)
{
ar[i]=nums[i]*nums[i];
}
for(int j=0;j<numsSize;j++)
{
for(int k=0;k<numsSize-j-1;k++)
{
if(ar[k]>ar[k+1])
{
int temp=ar[k];
ar[k]=ar[k+1];
ar[k+1]=temp;
}
}
}
*returnSize=numsSize;
return ar;
}
思路二:双指针的解法
指针 i 指向第一个位置,指针 j 指向最后一个元素,由于数组是有序的,所以,它的最大元素一定是在两边,此方法时间复杂度为O(n)
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums)
{
//定义一个新的数组
vector<int>res(nums.size(),0);
//由于两边向中间逼近是由大到小的过程
int k=nums.size()-1;
for(int i=0,j=nums.size()-1;i<=j; )
{
if(nums[i]*nums[i]>nums[j]*nums[j])
{
res[k--]=nums[i]*nums[i];
i++;
}
else
{
res[k--]=nums[j]*nums[j];
j--;
}
}
return res;
}
};