--- 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 icon: line-dot-left-horizontal 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