/**
 * @param {number[]} A
 * @return {number[]}
 */

/**
 * @param {number[]} A
 * @return {number[]}
 */
//My solution
// Time - O(n)
//Space - O(n)
var sortedSquares = function (arr) {
	const len = arr.length,
		negSquares = [],
		squares = []
	let i = 0,
		j
	while (arr[i] < 0) {
		const square = arr[i] ** 2
		negSquares.push(square)
		i++
	}
	j = i - 1
	while (i < len && j >= 0) {
		const square = arr[i] ** 2
		if (square < negSquares[j]) {
			squares.push(square)
			i++
		} else {
			squares.push(negSquares[j])
			j--
		}
	}
	while (j >= 0) {
		squares.push(negSquares[j])
		j--
	}
	while (i < len) {
		squares.push(arr[i] ** 2)
		i++
	}
	return squares
}

//https://leetcode.com/problems/squares-of-a-sorted-array/discuss/222079/Python-O(N)-10-lines-using-deque-beats-100
//reversed the array instead of using unshift() because it's faster
var sortedSquares = function (arr) {
	const squared = []
	let l = 0,
		r = arr.length - 1
	while (l <= r) {
		const left = arr[l] ** 2,
			right = arr[r] ** 2
		if (left > right) {
			squared.push(left)
			l++
		} else {
			squared.push(right)
			r--
		}
	}
	squared.reverse()

	return squared
}

//Test cases
console.log(sortedSquares([-4, -1, 0, 3, 10]))
console.log(sortedSquares([-4, -3, -1, 0, 10]))