977-有序数组的平方
标签:数组 双指针 排序
题目信息
题目地址: 977. 有序数组的平方
题目内容:
javascript
给你一个按非递减顺序排序的整数数组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) 的算法解决本问题
题解
解法一
思路:
暴力解法,先算出数组中每个数字的平方,然后按照
从小到大
的顺序排列
代码实现:
javascript
/**
* @param {number[]} nums
* @return {number[]}
*/
var sortedSquares = function(nums) {
const arr = nums.map(item => item ** 2)
arr.sort((a, b) => a - b)
return arr
};
解法二
思路:
使用
双指针
的思路,因为结果要非递减顺序排序
,所以每次获取较大的值从数组末尾往前放
,因为数组是非递减的,而且可能有负数,那么求出平方之后,有以下两种情况:1、如果
数组中都是正数,那数组中较大的值都在末尾
2、如果数组中有
负数
,数组中较大的值可能出现在数组头部和尾部
定义两个指针,
left
指针从数组索引为0
的元素开始,right
指针从数组最后一位
开始,然后比较left
和right
指针指向的数字的平方
大小如果
left
指针指向的数字的绝对值小于right
指针指向的数字的绝对值,则将right
指针指向的数字的平方放入数组中,并将right
指针向左移动一位
,否则同理left
指向数字平方放入数组,left右移一位
直到最后
left大于right
为止
代码实现:
javascript
/**
* @param {number[]} nums
* @return {number[]}
*/
var sortedSquares = function(nums) {
// 最大索引
let maxIndex = nums.length - 1
let left = 0
let right = maxIndex
const result = []
while(left <= right) {
const leftSquared = nums[left] ** 2,
rightSquared = nums[right] ** 2
if(leftSquared < rightSquared) {
result[maxIndex--] = rightSquared
right--
}else {
result[maxIndex--] = leftSquared
left++
}
}
return result
};