Skip to content
On this page

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指针从数组最后一位开始,然后比较leftright指针指向的数字的平方大小

如果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
};