997.有序数组的平方和

链接:. - 力扣(LeetCode)

题目描述:

给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序

示例 1:

输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]
解释:平方后,数组变为 [16,1,0,9,100]
排序后,数组变为 [0,1,9,16,100]

示例 2:

输入:nums = [-7,-3,2,3,11]
输出:[4,9,9,49,121]

提示:

  • 1 <= nums.length <= 104
  • -104 <= nums[i] <= 104
  • nums 已按 非递减顺序 排序

解法一

暴力解法:直接对数组中的每个元素进行平方,再进行简单排序

注意:此算法的时间复杂度为 O(n+nlogn)

解法二

双指针解法:时间复杂度为O(n)

由于数组最开始时是升序的状态,考虑特殊情况,如果数组值全为整数,或者数组值全为负数,那么数组元素平方和之后的值的升降序的状态也是可以确定的,即数组元素全为负数,那么平方和后的数组元素就为降序,如果数组元素全为正数,那么平方和后的数组元素则直接就是升序。

如果数组元素不是特殊的情况,即数组的元素有正数,也有负数,此时我们就可以知道,数组元素平方和之后肯定为先降序后升序,即如下图:

即平方和的之后的数组最小元素肯定出现在数组的中间位置,数组的最大元素就会出现在数组的两端,由于题目要求新数组为非降序,因此我们就可以考虑到使用双指针方法来解决,使用两个指针指向数组两端,进行平方和之后判断两个位置的值的大小,将较大的值在新数组中由后向前存储,这样得出的新数组直接就是一个非降序的数组

双指针具体实现:

我们可以定义两个指针,一个指针i指向起始位置,一个指针j指向数组末尾位置

定义一个新数组,长度与旧数组的长度相等,并为其分配内存空间,再定义一个变量n,指向新数组的最后一个元素,如果位置i对于元素的平方和大于位置j对于元素的平方和,我们就把较大的值赋值给新数组k位置的元素,并且更新k位置的值,让其前移一位,并且更新较大平方和位置的下标

C代码实现:

注意:

1.在while循环中,循环的终止条件应该为i>=j,而不是i>j,因为使用i>j的话会导致最小的那个数组元 素的平方和没有赋值给新数组就会直接跳出循环

2.在给新数组赋值时,我们要注意更新旧数组下标的位置

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值