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.
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 <= 104
-104 <= nums[i] <= 104
nums
is sorted in non-decreasing order.
Follow up: Squaring each element and sorting the new array is very trivial, could you find an
O(n)
solution using a different approach?
Solutions
Solution 1: Two Pointers
Since the array $nums$ is already sorted in non-decreasing order, the square values of the negative numbers in the array are decreasing, and the square values of the positive numbers are increasing. We can use two pointers, each pointing to the ends of the array. Each time we compare the square values of the elements pointed to by the two pointers, we put the larger square value at the end of the result array.
The time complexity is $O(n)$, where $n$ is the length of the array $nums$. Ignoring the space consumption of the answer array, the space complexity is $O(1)$.
Python3
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
ans = []
i, j = 0, len(nums) - 1
while i <= j:
a = nums[i] * nums[i]
b = nums[j] * nums[j]
if a > b:
ans.append(a)
i += 1
else:
ans.append(b)
j -= 1
return ans[::-1]
Java
class Solution {
public int[] sortedSquares(int[] nums) {
int n = nums.length;
int[] ans = new int[n];
for (int i = 0, j = n - 1, k = n - 1; i <= j; --k) {
int a = nums[i] * nums[i];
int b = nums[j] * nums[j];
if (a > b) {
ans[k] = a;
++i;
} else {
ans[k] = b;
--j;
}
}
return ans;
}
}
C++
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int n = nums.size();
vector<int> ans(n);
for (int i = 0, j = n - 1, k = n - 1; i <= j; --k) {
int a = nums[i] * nums[i];
int b = nums[j] * nums[j];
if (a > b) {
ans[k] = a;
++i;
} else {
ans[k] = b;
--j;
}
}
return ans;
}
};
Go
func sortedSquares(nums []int) []int {
n := len(nums)
ans := make([]int, n)
for i, j, k := 0, n-1, n-1; i <= j; k-- {
a := nums[i] * nums[i]
b := nums[j] * nums[j]
if a > b {
ans[k] = a
i++
} else {
ans[k] = b
j--
}
}
return ans
}
Rust
impl Solution {
pub fn sorted_squares(nums: Vec<i32>) -> Vec<i32> {
let n = nums.len();
let mut ans = vec![0; n];
let (mut i, mut j) = (0, n - 1);
for k in (0..n).rev() {
let a = nums[i] * nums[i];
let b = nums[j] * nums[j];
if a > b {
ans[k] = a;
i += 1;
} else {
ans[k] = b;
j -= 1;
}
}
ans
}
}
JavaScript
/**
* @param {number[]} nums
* @return {number[]}
*/
var sortedSquares = function (nums) {
const n = nums.length;
const ans = Array(n).fill(0);
for (let i = 0, j = n - 1, k = n - 1; i <= j; --k) {
const [a, b] = [nums[i] * nums[i], nums[j] * nums[j]];
if (a > b) {
ans[k] = a;
++i;
} else {
ans[k] = b;
--j;
}
}
return ans;
};
PHP
class Solution {
/**
* @param Integer[] $nums
* @return Integer[]
*/
function sortedSquares($nums) {
$n = count($nums);
$ans = array_fill(0, $n, 0);
for ($i = 0, $j = $n - 1, $k = $n - 1; $i <= $j; --$k) {
$a = $nums[$i] * $nums[$i];
$b = $nums[$j] * $nums[$j];
if ($a > $b) {
$ans[$k] = $a;
++$i;
} else {
$ans[$k] = $b;
--$j;
}
}
return $ans;
}
}