题目:给你一个按非递减顺序排序的整数数组nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。
- 第一反应的解法就是将原数组平方后再进行排序,但感觉时间复杂度太高了。
- 想到的第二个解法是通过对快排算法的改进,快排算法是将所有元素与枢轴元素进行比较,然后每一趟排序都能使得一个元素到达排序后的位置。只需要将比较的元素都用平方后的元素来进行比较,然后元素的移动还是按照原来的元素来,每趟排序的最后一次元素写入用元素的平方进行写入,这样多躺排序下来就能得到平方后的有序数组。
- 查看题解用的是双指针法,由于题目给的数组是非递减数组,本来是有序的,因此平方后的数组,大的肯定还是在两边,不可能在中间。因此可以用两个指针,一个指向数组的头部,一个指向数组的尾部,相向而行。每次对指针指向的元素的平方进行比较,将大的那个结果写入新数组的最后一个元素,然后将指向大的数的那个指针往前移动(头指针往后移,尾指针往前移),当两个指针相遇后就结束。显然这个题目用双指针法来会简单的多。
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* sortedSquares(int* nums, int numsSize, int* returnSize){
int *res = (int *)malloc(numsSize * sizeof(int));
*returnSize = numsSize;
int i,j,k;
i= 0;
j = numsSize - 1;
k = numsSize - 1;
while (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;
}