Nico的刷题日记(三)
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的刷题日记(三)相关推荐
- Nico的刷题日记(一)
LeetCode278. 第一个错误的版本 在入手了<算法图解>之后,静下心来开始刷题. 第一道题目描述如下: 题目分析: 这道题目是要求从一个最小值为1,依次递增1的有序数组中找到一个b ...
- Nico的刷题日记(二)
35. 搜索插入位置 题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引.如果目标值不存在于数组中,返回它将会被按顺序插入的位置. 请必须使用时间复杂度为 O(log n) 的算 ...
- 菜菜的刷题日记 | 66.加一 Plus One
系列索引:菜菜的刷题日记 | 被LeetCode用Python狂虐的那段日子 菜鸡的刷题之路--2022/1/7 文章目录 [题目] [我的代码] [参考代码1] [参考代码2] [参考代码3] [思 ...
- 一个算法笨蛋的12月leetCode刷题日记
类似文章 一个算法笨蛋的2021年11月leetCode刷题日记 一个算法笨蛋的2021年12月leetCode刷题日记 一个算法笨蛋的2022年1月leetCode刷题日记 一个算法笨蛋的2022年 ...
- 菜菜的刷题日记 | 蓝桥杯 — 十六进制转八进制(纯手撕版)附进制转换笔记
系列索引:菜菜的刷题日记 | 被LeetCode用Python狂虐的那段日子 万万没想到啊,回老家过年断更的几天之后,我会因为无聊在除夕这天做了会儿题,然后写篇题解. 文章目录 [题目] [我的代码] ...
- Leetcode刷题日记:21-25题篇
Leetcode刷题日记:21-25题篇 简介 题目: 21. 合并两个有序链表 22. 括号生成 23. 合并K个升序链表 24. 两两交换链表中的节点 25. K 个一组翻转链表 注 简介 这个系 ...
- leetcode刷题(三)——容斥原理
leetcode刷题系列三.这一节的内容主要是容斥原理的题目和题解. 百度百科上容斥原理的解释: 在计数时,必须注意没有重复,没有遗漏.为了使重叠部分不被重复计算,人们研究出一种新的计数方法,这种方法 ...
- 牛客刷题日记(2021-12-8)
牛客刷题日记(2021-12-8) 题目: 以下哪个接口的定义是正确的?( )interface B { void print() { } ;}interface B { static void pr ...
- 刷题日记【第十三篇】-笔试必刷题【数根+星际密码+跳台阶扩展问题+快到碗里来】
刷题日记[第十三篇]-笔试必刷题[数根+星际密码+跳台阶扩展问题+快到碗里来] 1.方法区在JVM中也是一个非常重要的区域,它与堆一样,是被[线程共享]的区域. 下面有关JVM内存,说法错误的是?(c ...
最新文章
- Java Programming Test Question 3
- C++跨平台开发方法/工具
- Gentoo 网络接口配置文件说明
- 【Leetcode | 】93. 复原IP地址
- TaskBar Hider – 用快捷键手动隐藏任务栏[Windows]
- 读取PDF的文字--zt
- Windows8 游戏开发教程-开篇
- mule esb_Mule ESB –入门
- MATLAB-绘图-散点图绘制
- 凸优化第三章凸函数 3.3共轭函数
- java英文字母_用JAVA编一个程序输出全部的英文字母
- CGAL 4.11 官方文档 软件包概述 ——胞腔复形与多面体类
- python随机生成英文字符串_如何用Python语言生成随机字符串 | 学步园
- 依赖注入和反转控制的区别
- 计算机专业理科二本录取分数线,理科二本大学排名及分数线
- Zcash中的hash函数
- py3 BeautifulSoup 利器 html 解析器使用
- 中国空气能热水器市场品牌竞争格局与投资价值分析报告2022版
- 今天终于把黄色书看完了
- 安全管家安卓_联想电脑管家的使用体验分享
热门文章
- target is not existed: .page-component__scroll .el-scrollbar__wrap
- IDEA jjsp 404_IDEA 卡住buid(编译)不动的解决办法_java
- EOFError: marshal data too short
- android 浏览器控件
- 数学建模模型2——多属性决策模型之加权算术平均算子【评价型】
- STM32使能IIC驱动电流检测芯片INA226
- myeclipse的server视图经常报nullpoint
- Linux磁盘分区初始化
- Unity TextMeshpro创建中文字体
- 利用Python控制德国Vialux DMD 2021-10-03