简单 | 双指针 |

一. 题目描述

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

二. 题目示例

:::tips 输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]
::: :::tips 输入:nums = [-7,-3,2,3,11]
输出:[4,9,9,49,121]
:::

三. 题目解答

1. 思路

利用相向双指针,分别指向数组头尾,将较大平方数头插进结果数组。

  • 若数组全为正数,由于数组本身有序,则最大值在最大整数处产生。
  • 若数组全为负数,由于数组本身有序,则最大值在最小负数处产生。
  • 若数组有正有负,由于数组本身有序,则最大平方值在最小负数和最大整数间产生,即在头尾下标处产生。

    2. 代码

    1. /**
    2. * @param {number[]} nums
    3. * @return {number[]}
    4. */
    5. var sortedSquares = function(nums) {
    6. let result = [];
    7. let start=0, end=nums.length-1;
    8. // 平方 + 排序
    9. while(start <= end){
    10. const n1 = nums[start]**2;
    11. const n2 = nums[end]**2;
    12. if(n1 >= n2){
    13. result.unshift(n1);
    14. start++;
    15. } else {
    16. result.unshift(n2);
    17. end--;
    18. }
    19. }
    20. return result;
    21. };