算法练习第7道-有序数组的平方

159 阅读1分钟

题目

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

思考

看题目,我们要将数组种的每个值都成平方,排序之后也要按顺序。

方式1

  • 首先我们需要遍历每个数据,为每个数组成平方,然后把这个数组push到新的数组上,
  • 之后我们通过sort排序,返回从小到大的数组

遍历,平方,并push到数组上

  let len = nums.length, arr = []
  for(let i = 0; i < len; i++) {
    arr.push(nums[i]*nums[i])
  }

利用sort排序

arr.sort((a,b) => a-b)

完整的代码如下

var sortedSquares = function(nums) {
    let len = nums.length, arr = []
  for(let i = 0; i < len; i++) {
    arr.push(nums[i]*nums[i])
  }
  return arr.sort((a,b) => a-b)
};

方式2 利用map

这里利用map遍历每个item 同时让他们平方,之后再利用sort排序

return nums.map(item => item * item).sort((a, b) => a - b)

方式3

  • 定义一个新得数组,存放结果
  • 定义leftright, 分别从左右两边开始遍历数组,
  • 将它们平方,然后比较大小,将大得插入头部
  • 直到中间得指针撞上,然后返回数组

定义数组和指针

let result = [], left = 0, rigth = nums.length - 1

然后通过while循环,同时将他们平方

while(left <= rigth) {
    let leftNum = nums[left] * nums[left], rightNum = nums[rigth] * nums[rigth]
  
}

然后比较大小,将大得插入头部,同时left++ right--

if(leftNum> rightNum) {
      result.unshift(leftNum)
      left++
} else {
      result.unshift(rightNum)
      rigth--
}

完整代码:

  let result = [], left = 0, rigth = nums.length - 1
  while(left <= rigth) {
    let leftNum = nums[left] * nums[left], rightNum = nums[rigth] * nums[rigth]
    if(leftNum> rightNum) {
      result.unshift(leftNum)
      left++
    } else {
      result.unshift(rightNum)
      rigth--
    }
  }
  return result

运行结果:

image.png