虽然原数组有序,但平方后大小关系可能改变,所以应比较平方后的值进行排序。
暴力解法:先平方再排序
- 时间复杂度:O(nlogn)~O(n^2)
双指针法(相向双指针):
- 时间复杂度:O(n)
- 定义左右两指针,通过比较俩指针对应值平方的大小,对新数组进行逆序赋值。
- 为什么要从两端开始呢?因为平方后最大值存在于左右两端,即平方后大小变化可能是先变小再变大。
动图解释:
代码:
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* sortedSquares(int* nums, int numsSize, int* returnSize){
//旧数组 数组长度 新数组长度
* returnSize = numsSize;//新数组长度仍等于旧数组长度
int leftIndex = 0;//定义左指针
int rightIndex = numsSize - 1;//定义右指针
int* newArray = (int *)malloc(numsSize * sizeof(int));//定义新数组
for(int i = rightIndex; leftIndex <= rightIndex ; i--) {//这要用<=,因为要处理最后两个元素;不用判断i>=0,因为判断左右指针就可以保证不越界了
int left = nums[leftIndex] * nums[leftIndex];
int right = nums[rightIndex] * nums[rightIndex];
if(left >= right) {//当左值平方大于右值平方时,对新数组逆序赋值,即将较大值逆序放入数组
newArray[i] = left;
leftIndex ++;//左指针下标+1
}else {//当左值平方小于右值平方时,同理
newArray[i] = right;
rightIndex --;//右指针下标-1
}
}
return newArray;
}