## Problem Statement

Given an array of non-decreasing numbers, return a sorted, non-increasing array of each number's squared value in O(n) time. Consider the below:

```
//Given array
[-4,-1,0,3,10]
//Expected return value
[0,1,9,16,100]
```

## Solution Explained

This problem deals with array traversal. In this case, we'll be traversing the given array starting at the end `n[n.length - 1]`

and moving toward the beginning `n[0]`

.

While we move from the back of the array toward the front, we'll be constructing a new array. For each index of the new array, we'll look at the absolute value of the furthest LEFT and furthest RIGHT element.

```
let result = []
[-4, -1, 0, 3, 10]
^ ^
4 10
```

Whichever is greater (10 in this case), we will set as the end of our result array at index `n.length - 1`

and then decrement the index to set the next element.

```
let result = []
[-4, -1, 0, 3, 10]
^ ^
4 3
let result = [empty, empty, empty, empty, 100]
```

Now, we repeat this process. In this case, 4 is greater than 3. We'll now set the index of `n.length - 2`

to the square of 4 (i.e. 16).

```
let result = []
[-4, -1, 0, 3, 10]
^ ^
1 3
let result = [empty, empty, empty, 16, 100]
```

## Solution in Code

```
var sortedSquares = function(nums) {
const arr = [];
let left = 0;
let right = nums.length - 1;
for (let i = nums.length - 1; i >= 0; i--) {
const leftNum = nums[left] ** 2;
let rightNum = nums[right] ** 2;
if (leftNum < rightNum) {
arr[i] = rightNum;
right--;
} else {
arr[i] = leftNum;
left++;
}
}
return arr;
};
```