LeetCode(力扣)::977. 有序数组的平方

目录

 1、题目

 2、思路

 3、实现

 4、结果与总结

-1、完整代码


 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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值