---
title: '977. Squares of a Sorted Array'
description: Given an integer array nums sorted in non-decreasing order, return an array of the squares of each number sorted in non-decreasing order
sidebar:
  label: 'Squares of a Sorted Array'
  badge: 'Easy'
---

Array

::::warning
Squaring each element and sorting the new array is very trivial, could you find an O(n) solution using a different approach?
::::

### Example 1:
- Input: `nums = [-4,-1,0,3,10]`
- Output: `[0,1,9,16,100]`
- Explanation: After squaring, the array becomes `[16,1,0,9,100]`. After sorting, it becomes `[0,1,9,16,100]`.

### Example 2:
- Input: `nums = [-7,-3,2,3,11]`
- Output: `[4,9,9,49,121]`

### Constraints:

- `1 <= nums.length <= 10^4`
- `-10^4 <= nums[i] <= 10^4`
- `nums` is sorted in non-decreasing order.

## Approach

```mermaid
flowchart TD
  S(["sortedSquares(nums)"]) --> I["ans = Array(n), left = 0, right = n - 1"]
  I --> L{"more i from n-1 down to 0?"}
  L -- no --> E(["return ans"])
  L -- yes --> C{"abs(nums[left]) < abs(nums[right])?"}
  C -- yes --> R["square = nums[right]; right--"]
  C -- no --> F["square = nums[left]; left++"]
  R --> W["ans[i] = square * square — fill from the back, largest first"]
  F --> W
  W --> L
```

## Solution

```js
/**
 * @param {number[]} nums
 * @return {number[]}
 */
var sortedSquares = function(nums) {
  let n = nums.length;
  let ans = new Array(nums.length);
  let left = 0, right = nums.length - 1;

  for (let i = n -1; i >= 0; i--){
    let square;
    if(Math.abs(nums[left]) < Math.abs(nums[right])){
      square = nums[right];
      right--;
    }else{
      square = nums[left];
      left++;
    }
    ans[i] = square*square;
  }
  return ans;
};
```

## Explanation

[Squares of a Sorted Array - Leetcode 977 - Python](https://www.youtube.com/watch?v=FPCZsG_AkUg)
