给你一个按 非递减顺序 排序的整数数组 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) 的算法解决本问题

Related Topics

  • 数组
  • 双指针
  • 排序

官方的解法是先找到正负分界下标,双指针是从分界往两边,小的值放入结果数组头部。

也可以, 双指针从两边往中间,大的值放入结果数组尾部, 不用事先遍历数组求正负分界下标,不过在俩个指针相遇前都需要对两个指针位置的数组值做平方运行,而官方的解法只要有一端走到头部或者尾部,就不用做平方和比较了,把没走完的一端的值依次放进数组就好,或者直接做数组拷贝,在一些原数组正负值数量差距较大的效率可能会有差异。

    public int[] sortedSquares(int[] nums) {
// 左指针,指向原数组最左边
int left = 0;
// 有指针,指向原数组最右边
int right = nums.length - 1;
// 创建一个新数组,存储平方值
int[] result = new int[nums.length];
// 得到元素值平方值,从新数组最后位置开始写
int write = nums.length - 1;
// 左右指针相遇(逐渐靠拢的过程)之后不再循环
while (left <= right){
// 如果原数组的左指针对应的平方值大于右指针,那么往新数组最后位置写入左指针对应的平方值
if (nums[left] * nums[left] > nums[right] * nums[right]){
result[write] = nums[left] * nums[left];
// 左指针右移
left ++;
// 移动新数组待写入的位置
write --;
}
else {
result[write] = nums[right] * nums[right];
right --;
write --;
}
}
return result;
}

最新文章

  1. yii2权限控制rbac之rule详细讲解
  2. 高介分类:核方法与支持向量机(SVM)
  3. ASP.NET MVC WEB API字段出现k__BackingField
  4. 【python】用setup安装自定义模块和包
  5. Redis内存使用优化与存储
  6. [No000005]C#注册表操作,创建,删除,修改,判断节点是否存在
  7. jquery的扩展之extend函数
  8. 关于ul和dl的区别
  9. TensorFlow框架之Computational Graph详解
  10. IDL 数组运算
  11. Java-ServletResponse-ServletResponseWrapper
  12. arr.sort()
  13. redis make编译失败的原因
  14. MetaMask/metamask-extension/mascara 的运行实现
  15. jdk1.8 HashMap红黑树操作详解-putTreeVal()
  16. 解决 ionic 中的 CORS(跨域)
  17. python中的*arg和**kwargs
  18. 通过Referer设置来防盗链
  19. grep 详解
  20. jquery的常用操作(操作html页面的Dom对象的元素)

热门文章

  1. 你真的懂TSP吗
  2. 【一】工程配置与电机控制part1
  3. Linux 常用管理命令
  4. VUE3 之 状态动画 - 这个系列的教程通俗易懂,适合新手
  5. 电子检索实体书「GitHub 热点速览 v.22.12」
  6. 【Vulnhub靶场】RED: 1
  7. 巧用&quot;记事本&quot;让病毒无效运行
  8. [SPDK/NVMe存储技术分析]010 - 理解SGL
  9. C# WinForm 解决子窗体放大后,子窗体图标放大的问题
  10. Java并发编程虚假唤醒问题(生产者和消费者关系)