方法一:暴力法:先平方再排序
void QuickSort(int *num,int low,int high){
int i=low;
int j=high;
int value=num[low];
int temp=0;
if(i>j) return;
while(i!=j){
while(num[j]>=value&&j>i) j--;
while(num[i]<=value&&j>i) i++;
if(i<j){
temp =num[i];
num[i]=num[j];
num[j]=temp;
}
}
num[low]=num[i];
num[i]=value;
QuickSort(num,low,i-1);
QuickSort(num,i+1,high);
}
//以上为快排
int* sortedSquares(int* nums, int numsSize, int* returnSize){
int i=0;
int *answer=(int*)malloc(sizeof(int)*numsSize);
*returnSize = numsSize;
while(i<numsSize) {
answer[i]=nums[i]*nums[i];
i++;
}
QuickSort(answer,0,numsSize-1);
return answer;
}
方法二:双指针法,借鉴了 代码随想录 的代码,因为给定数组已经排序了,所以形成数组平方后的最大值只可能在两端取得,要么是数组最前面的元素,负的很负,平方后就很大,要么是数组最后的元素,本身很大,平方后很大。所以使用双指针对最前面和最后面的元素在平方后进行对比,将其中的最大值放入新数组的最后,并移动指针。
int* sortedSquares(int* nums, int numsSize, int* returnSize){
int i=0;
int j=numsSize-1;
int idex=numsSize-1;
int *answer=(int*)malloc(sizeof(int)*numsSize);
*returnSize=numsSize;
while(i<=j){
if(nums[i]*nums[i]>nums[j]*nums[j]){
answer[idex--]=nums[i]*nums[i];
i++;
}
else{
answer[idex--]=nums[j]*nums[j];
j--;
}
}
return answer;
}