目录
1、题目
我们通过阅读题干,可以得到的信息有:我们现在处理的是一个非降序数组(升序,且正负数都包含),要求我们返回一个数组,返回数组中的元素是原数组元素的平方,且依旧按非降序排列。
2、思路
如果原数组中全是非负数,则平方后元素之间大小关系是不会改变的,按原顺序依次放入新数组即可。但是如果数组中出现负数的情况下,我们需要思考负数的特点——较大的负数在平方后大于较小负数的平方,例如:(-2)^2 > (-1)^2 —>4>1。依据此特性,我们已经确定了解题思路——创建两个指针,分别从数组头尾开始遍历,比较指向元素平方的大小,将较大的数放在新数组尾部(也可以将较小的数字放在新数组头部)。
3、实现
int* sortedSquares(int* nums, int numsSize, int* returnSize)
根据题目所给的接口,我们可知接收的数据有:原数组,原数组长度,新数组长度。
我们已知只给原数组内元素进行平方操作,然后在新数组内按序存放。所以新数组长度应该等于原数组长度。
*returnSize = numsSize;//返回数组长度=原数组长度
再创建两个新的指针,用来对比头尾元素的大小,将两者之间较大的那个元素放进创建的新数组
int left = 0;//左指针从数组头开始遍历
int right = numsSize - 1;//右指针从数组尾开始遍历
int* ret = (int*)malloc(sizeof(int) * numsSize);//创建新数组
开始循环
for (int index = numsSize - 1; index >= 0; index--)//从新数组尾开始存放元素,意味着先存大元素,后存小元素
{
if (nums[left] * nums[left] > nums[right] * nums[right])//前面元素大于后面元素
{
ret[index] = nums[left] * nums[left];//较大的元素赋给新数组
left++;//指针后移
}
else
{
ret[index] = nums[right] * nums[right];//后面元素大于前面元素
right--;//指针前移
}
}
return ret;
4、结果与总结
leetcode通过。
此题运用的思路是一个很简单的双指针对比思想。按原数组元素的大小顺序,依次放入新数组,完成一个新数组的排序。此时该算法的时间复杂度为O(N),因为我们只遍历一次数组,每次进行的操作只有对比操作,可以看作常数阶。
-1、完整代码
int* sortedSquares(int* nums, int numsSize, int* returnSize)
{
*returnSize = numsSize;//返回数组长度=原数组长度
int left = 0;//左指针从数组头开始遍历
int right = numsSize - 1;//右指针从数组尾开始遍历
int* ret = (int*)malloc(sizeof(int) * numsSize);//创建新数组
for (int index = numsSize - 1; index >= 0; index--)
{
if (nums[left] * nums[left] > nums[right] * nums[right])
{
ret[index] = nums[left] * nums[left];
left++;
}
else
{
ret[index] = nums[right] * nums[right];
right--;
}
}
return ret;
}