这个题首先第一眼想到的应该是暴力解法,先全平方再排序,但是还有一种双指针思路,因为平方后最大的肯定在第一位和最后一位,可以定义两个指针,一个指在首位,一个在末尾,判断平方后的大小关系。代码如下:
暴力:
int cmp(int* a, int* b) {
return *a - *b;
}
int* sortedSquares(int* nums, int numsSize, int* returnSize){
(*returnSize) = numsSize;
int*ree=malloc(sizeof(int)*numsSize);
for(int i=0;i<numsSize;++i){
ree[i]=nums[i]*nums[i];
}
qsort(ree, numsSize, sizeof(int), cmp);
return ree;
}
双指针:
int* sortedSquares(int* nums, int numsSize, int* returnSize){
*returnSize=numsSize;
int right=numsSize-1;
int left=0;
int* ans = (int*)malloc(sizeof(int) * numsSize);
int index;
for(index = numsSize - 1; index >= 0; index--) {
//左指针指向元素的平方
int lSquare = nums[left] * nums[left];
//右指针指向元素的平方
int rSquare = nums[right] * nums[right];
//若左指针指向元素平方比右指针指向元素平方大,将左指针指向元素平方放入结果数组。左指针右移一位
if(lSquare > rSquare) {
ans[index] = lSquare;
left++;
}
//若右指针指向元素平方比左指针指向元素平方大,将右指针指向元素平方放入结果数组。右指针左移一位
else {
ans[index] = rSquare;
right--;
}
}
//返回结果数组
return ans;
}