有序数组的平方

30 阅读1分钟

有序数组的平方

力扣题目链接

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

实现

暴力解法

最简单的方案是先平方再排序。

function sortedSquares(nums: number[]): number[] {
    return nums.map(i => i * i).sort((a, b) => a - b);
};

双指针

一个包含负数的升序数组,那么他的平方最大值一定在两端,所以可以设置两个指针,分别指向开头和结尾,每次比较,将较大的数放入结果集中即可。

function sortedSquares(nums: number[]): number[] {
    const result = []
    const size = nums.length
    let k = size - 1

    for(let i = 0, j = size - 1; i <= j;) {
        if(nums[i] * nums[i] < nums[j] * nums[j]) {
            result[k--] = nums[j] * nums[j]
            j--
        } else {
            result[k--] = nums[i] * nums[i]
            i++
        }
    }

    return result
};