算法题-数组-977-有序数组的平方

21 阅读1分钟

977-有序数组的平方

题目描述

给你一个按 非递减顺序 排序的整数数组 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]

分析

可以考虑两头并进,从两边向中间前进,i和j分别指向最左边以及最右边,判断两个指针所指元素的绝对值大小,如果i大则新数组中加入它的平方并且i++,如果j大则新数组加入它的平方并且j--,直到i>j,输出新数组的翻转即可。

题解

/**
 * @param {number[]} nums
 * @return {number[]}
 */
var sortedSquares = function(nums) {
    let i=0, j=nums.length-1;
    let newNums = [];
    while(i<=j) {
        if(Math.abs(nums[i])>=Math.abs(nums[j])) {
            newNums.push(nums[i]*nums[i]);
            i++;
        } else {
            newNums.push(nums[j]*nums[j]);
            j--;
        }
    }
    return newNums.reverse()
};

分析

时间复杂度:O(n)

空间复杂度:O(n)

优化 - 语法

/**
 * @param {number[]} nums
 * @return {number[]}
 */
var sortedSquares = function(nums) {
    const n = nums.length;
    const ans = new Array(n).fill(0);

    let l = 0, r = n - 1;
    let i = n - 1;
    while(l <= r){
        if(nums[l] * nums[l] > nums[r] * nums[r]){
            ans[i--] = nums[l] * nums[l++];
        }else{
            ans[i--] = nums[r] * nums[r--];
        }
    }
    return ans;
};