【一天一大 lee】有序数组的平方 (难度:简单) - Day20201016

475 阅读2分钟

题目:

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

示例:

  1. 示例 1:
输入:[-4,-1,0,3,10]
输出:[0,1,9,16,100]
  1. 示例 2:
输入:[-7,-3,2,3,11]
输出:[4,9,9,49,121]

提示:

  1. 1 <= A.length <= 10000
  2. -10000 <= A[i] <= 10000
  3. A 已按非递减顺序排序。

抛砖引玉

思路

先遍历求平方(注意取绝对值),再排序

不知道本题题目描述时为什么要将非递减,而不直接讲递增,这样增加了理解题意的难度

抛砖引玉
抛砖引玉
/**
 * @param {number[]} A
 * @return {number[]}
 */
var sortedSquares = function(A) {
  return A.map((i) => i * i).sort((ab) => a - b)
}

双指针

本题循环求平方的逻辑可以忽略,主要考察的应该是数组排序的问题

只是本题因为涉及求平方,所以排序可以借助求平方的循环完成:

  • 以为 A 本身是递增的,那么平方的绝对值较大的原始一定出现在数组的首尾部分
  • 声明左右两个指针从 A 的头和尾分别计算
  • 两个指针上面的数谁大谁先存放到结果数组中
  • 存放顺序从后向前(从大到小)
/**
 * @param {number[]} A
 * @return {number[]}
 */
var sortedSquares = function(A) {
  let len = A.length,
    _result = [],
    left = 0,
    right = len - 1,
    index = len - 1
  while (left <= right) {
    if (A[left] * A[left] > A[right] * A[right]) {
      _result[index] = A[left] * A[left]
      ++i
    } else {
      _result[index] = A[right] * A[right]
      --right
    }
    --index
  }
  return _result
}

博客: 前端小书童

每天的每日一题,写的题解会同步更新到公众号一天一大 lee 栏目 欢迎关注留言

公众号:前端小书童