题目
给你一个按 非递减顺序 排序的整数数组 nums
,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
解题思路
基于快速排序的暴力求解法
拿到题目首先想到的就是将数组中每个数先进行平方,再对数组进行排序。
这总思路的实现,顺便复习了下快速排序的思路,下面是我的代码实现
//基于快速排序的暴力解决法
void QuickSock(int* arr, int begin, int end)
{
if (begin >= end)return;
int left = begin;
int right = end;
int keyi = begin;
while (begin < end)
{
while (arr[end] >= arr[keyi] && begin < end)
{
--end;
}
while (arr[begin] <= arr[keyi] && begin < end)
{
++begin;
}
int imp = arr[end];
arr[end] = arr[begin];
arr[begin] = imp;
}
int imp = arr[keyi];
arr[keyi] = arr[end];
arr[end] = imp;
keyi = end;
QuickSock(arr, left, keyi - 1);
QuickSock(arr, keyi + 1, right);
}
int* sortedSquares(int* nums, int numsSize, int* returnSize)
{
*returnSize = numsSize;
int* result = malloc(sizeof(int) * numsSize);
for (int i = 0; i < numsSize; i++)
{
result[i] = nums[i] * nums[i];
}
QuickSock(result, 0, numsSize - 1);
return result;
}
平均时间复杂度是O(n + nlogn)
双指针法
题目中给的是有序数组,前面的方法没用到这个已知条件
平方后的排序,无非就是与数字的绝对值有关,因为数组本身就是个有序数组,所以其平方的最小值一定是在中间某个位置的而不是在左右俩边;可以利用这个特性定义个双指针,分别比较左右俩边平方的大小并把大的先存入新数组,省去了快速排序
代码如下
//双指针法
int* sortedSquares(int* nums, int numsSize, int* returnSize)
{
*returnSize = numsSize;
int* result = malloc(sizeof(int) * numsSize);
int resultNum = numsSize - 1;
int begin = 0;
int end = numsSize - 1;
while (begin <= end)
{
if (nums[begin] * nums[begin] > nums[end] * nums[end])
{
result[resultNum--] = nums[begin] * nums[begin];
begin++;
}
else
{
result[resultNum--] = nums[end] * nums[end];
end--;
}
}
return result;
}
时间复杂度为O(n),即省去了快速排序的时间复杂度