977. 有序数组的平方

LeetCode 原题链接

image.png

实现思路

  • 该题的难点在于负数在平方后可能会变成较大的数,因此不能直接对数组进行平方后排序。
  • 可以使用双指针的方法,分别指向数组的两端,比较两端的平方值,将较大的平方值放入结果数组的末尾,然后移动对应的指针,直到两个指针相遇。

代码实现

var sortedSquares = function (nums) {
  const n = nums.length;

  // 定义一个新的数组,用来存储平方后的结果
  const result = new Array(n);
  let left = 0;
  let right = n - 1;

  // 定义结果数组开始填充的索引,从末尾开始
  let index = n - 1;

  while (left <= right) {
    const leftSquare = nums[left] * nums[left];
    const rightSquare = nums[right] * nums[right];

    if (leftSquare > rightSquare) {
      result[index] = leftSquare;
      left++;
    } else {
      result[index] = rightSquare;
      right--;
    }

    // 每次填充完一个元素后,索引向前移动
    index--;
  }

  return result;
};