mirror of
https://github.com/prdlk/leetcode.git
synced 2026-11-02 13:12:44 +00:00
75 lines
1.8 KiB
Plaintext
75 lines
1.8 KiB
Plaintext
---
|
|
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: dot
|
|
topics:
|
|
- { name: "Array", slug: "array" }
|
|
- { name: "Two Pointers", slug: "two-pointers" }
|
|
- { name: "Sorting", slug: "sorting" }
|
|
video: "FPCZsG_AkUg"
|
|
sidebar:
|
|
label: 'Squares of a Sorted Array'
|
|
badge: 'Easy'
|
|
---
|
|
|
|
::::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;
|
|
};
|
|
```
|