977. 有序数组的平方

题目描述

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

思路分析

以官方的方法二思路为例,双指针。
描述中提到了非递减顺序的数组,也就是说,刚开始的数组已经排好顺序了,我们只要利用到这个前提,就可以很轻松的解答它。
什么是非递减顺序的数组呢?比如:

  • -2 -1 0 1 1 5
  • -5 -4 -2 -1
  • 0 2 9 5 5 6

这些都是非递减顺序的数组,它们里面重复的数字出现,顺序是递增的或者是前一个与后一个相等的。负数在平方后会变成正数,也就是说,如果负数数组是递增的,那么他平方后的正数数组一定是递减的。

以 [-2,-1,0,1,1,5 ]这个数组为例,我们以第一个非负整数0为边界,可以分成[-2,-1]和[0,1,1,5]两个数组,平别平方后变成了[4,1]和[0,1,1,25]两个数组。

这个时候我们定义left为(初始数字是)负整数数组的最大下标,定义right为(初始数字是)非负整数数组的初始下标0,每次比较两个下标对应的数字,谁小就把谁放到最终的结果(新建一个数组)中。如果放入了左边的数,那么将左边的数字指针左移;如果放入了右边的数,那么将右边的数字指针右移。

如果left小于0了或者right超出范围了,那么退出循环。将多余数组中的数组按照从小到大的顺序放入结果中。

代码

 public int[] sortedSquares(int[] nums) {// 先把数字平方,放到一个新数组中int[] newNums = new int[nums.length];for (int i = 0; i < nums.length; i++) {newNums[i] = nums[i] * nums[i];}int resultNum = -1;for (int i = 0; i < nums.length; i++) {if (nums[i] >= 0) {resultNum = i;break;}if (i == nums.length-1) {resultNum = i;}}int nonNegativeIntegerIndex = resultNum;// (初始数字)负整数集合int[] negativeIntegerNums = Arrays.copyOfRange(newNums, 0, nonNegativeIntegerIndex);// (初始数字)非负整数集合int[] nonNegativeIntegerNums = Arrays.copyOfRange(newNums, nonNegativeIntegerIndex, newNums.length);int left = negativeIntegerNums.length - 1;int right = 0;int[] result = new int[newNums.length];int index = 0;while (right <= nonNegativeIntegerNums.length - 1 && left >= 0) {int leftNum = negativeIntegerNums[left];int rightNum = nonNegativeIntegerNums[right];if (leftNum < rightNum) {result[index] = leftNum;index++;left--;} else {result[index] = rightNum;index++;right++;}}while (left >= 0) {int leftNum = negativeIntegerNums[left];result[index] = leftNum;index++;left--;}while (right <= nonNegativeIntegerNums.length - 1) {int rightNum = nonNegativeIntegerNums[right];result[index] = rightNum;index++;right++;}return result;}

结果

Nico的刷题日记(三)相关推荐

  1. Nico的刷题日记(一)

    LeetCode278. 第一个错误的版本 在入手了<算法图解>之后,静下心来开始刷题. 第一道题目描述如下: 题目分析: 这道题目是要求从一个最小值为1,依次递增1的有序数组中找到一个b ...

  2. Nico的刷题日记(二)

    35. 搜索插入位置 题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引.如果目标值不存在于数组中,返回它将会被按顺序插入的位置. 请必须使用时间复杂度为 O(log n) 的算 ...

  3. 菜菜的刷题日记 | 66.加一 Plus One

    系列索引:菜菜的刷题日记 | 被LeetCode用Python狂虐的那段日子 菜鸡的刷题之路--2022/1/7 文章目录 [题目] [我的代码] [参考代码1] [参考代码2] [参考代码3] [思 ...

  4. 一个算法笨蛋的12月leetCode刷题日记

    类似文章 一个算法笨蛋的2021年11月leetCode刷题日记 一个算法笨蛋的2021年12月leetCode刷题日记 一个算法笨蛋的2022年1月leetCode刷题日记 一个算法笨蛋的2022年 ...

  5. 菜菜的刷题日记 | 蓝桥杯 — 十六进制转八进制(纯手撕版)附进制转换笔记

    系列索引:菜菜的刷题日记 | 被LeetCode用Python狂虐的那段日子 万万没想到啊,回老家过年断更的几天之后,我会因为无聊在除夕这天做了会儿题,然后写篇题解. 文章目录 [题目] [我的代码] ...

  6. Leetcode刷题日记:21-25题篇

    Leetcode刷题日记:21-25题篇 简介 题目: 21. 合并两个有序链表 22. 括号生成 23. 合并K个升序链表 24. 两两交换链表中的节点 25. K 个一组翻转链表 注 简介 这个系 ...

  7. leetcode刷题(三)——容斥原理

    leetcode刷题系列三.这一节的内容主要是容斥原理的题目和题解. 百度百科上容斥原理的解释: 在计数时,必须注意没有重复,没有遗漏.为了使重叠部分不被重复计算,人们研究出一种新的计数方法,这种方法 ...

  8. 牛客刷题日记(2021-12-8)

    牛客刷题日记(2021-12-8) 题目: 以下哪个接口的定义是正确的?( )interface B { void print() { } ;}interface B { static void pr ...

  9. 刷题日记【第十三篇】-笔试必刷题【数根+星际密码+跳台阶扩展问题+快到碗里来】

    刷题日记[第十三篇]-笔试必刷题[数根+星际密码+跳台阶扩展问题+快到碗里来] 1.方法区在JVM中也是一个非常重要的区域,它与堆一样,是被[线程共享]的区域. 下面有关JVM内存,说法错误的是?(c ...

最新文章

  1. Java Programming Test Question 3
  2. C++跨平台开发方法/工具
  3. Gentoo 网络接口配置文件说明
  4. 【Leetcode | 】93. 复原IP地址
  5. TaskBar Hider – 用快捷键手动隐藏任务栏[Windows]
  6. 读取PDF的文字--zt
  7. Windows8 游戏开发教程-开篇
  8. mule esb_Mule ESB –入门
  9. MATLAB-绘图-散点图绘制
  10. 凸优化第三章凸函数 3.3共轭函数
  11. java英文字母_用JAVA编一个程序输出全部的英文字母
  12. CGAL 4.11 官方文档 软件包概述 ——胞腔复形与多面体类
  13. python随机生成英文字符串_如何用Python语言生成随机字符串 | 学步园
  14. 依赖注入和反转控制的区别
  15. 计算机专业理科二本录取分数线,理科二本大学排名及分数线
  16. Zcash中的hash函数
  17. py3 BeautifulSoup 利器 html 解析器使用
  18. 中国空气能热水器市场品牌竞争格局与投资价值分析报告2022版
  19. 今天终于把黄色书看完了
  20. 安全管家安卓_联想电脑管家的使用体验分享

热门文章

  1. target is not existed: .page-component__scroll .el-scrollbar__wrap
  2. IDEA jjsp 404_IDEA 卡住buid(编译)不动的解决办法_java
  3. EOFError: marshal data too short
  4. android 浏览器控件
  5. 数学建模模型2——多属性决策模型之加权算术平均算子【评价型】
  6. STM32使能IIC驱动电流检测芯片INA226
  7. myeclipse的server视图经常报nullpoint
  8. Linux磁盘分区初始化
  9. Unity TextMeshpro创建中文字体
  10. 利用Python控制德国Vialux DMD 2021-10-03