977. 有序数组的平方

99 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第14天,点击查看活动详情

题目 leetcode.cn/

  • 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。

示例

  • 输入: nums = [-4,-1,0,3,10];输出: [0,1,9,16,100]

    • 解释: 平方后,数组变为 [16,1,0,9,100];排序后,数组变为 [0,1,9,16,100]
  • 输入: nums = [-7,-3,2,3,11];输出: [4,9,9,49,121]

提示

  • 1 <= nums.length <= Math(10, 4)
  • -Math(10, 4) <= nums[i] <= Math(10, 4)

代码

function sortedSquares(nums: number[]): number[] {
     let result = [];
     for(let i = 0; i < nums.length; i++){
         result.push(Math.pow(nums[i], 2));
     }
     return result.sort((a, b) => { return a- b; });
};
  • 数组中包含正整数和负整数,但是平方后一定都是正整数的
  • 先求平方再排序
    • 首先可以定义一个保存平方后的整数的数组
    • 然后遍历给定的数组,将数组内的每一个值都平方一次,这里用的Math.pow(a, b)方法用来求平方值,参数a是底数,参数b是指数幂,例如:Math(10, 2)就是求10的平方值
    • 将平方后的正整数添加到定义好的变量数组中
    • 利用数组的sort方法将数组按照升序排序,返回结果即可
function sortedSquares(nums: number[]): number[] {
    let result = nums.sort((a, b) => {return Math.abs(a) - Math.abs(b)});
    let arr = [];
    for(let i = 0; i < result.length; i++){
        arr.push(Math.pow(result[i], 2));
    }
    return arr
};
  • 先排序,再求平方值

    • 首先利用数组的sort方法按照升序排序数组,值得注意的是,排序的同时要把值转化为绝对值排序,因为负整数的平方后是正整数
    • 然后遍历排序后的数组
    • 同上,将数组的每一项求平方后添加到数组变量中,这里也可以用nums[i] * nums[i]的方式求平方值
    • 最后返回结果变量即可
  • 附加题:请你设计时间复杂度为 O(n) 的算法解决本问题