The largest square is at one of the two ends. Fill the result backward while moving the pointer with the larger absolute value.
Complexity
O(n) time and O(n) output space.
Square a sorted integer array and return the squared values in sorted order.
The largest square is at one of the two ends. Fill the result backward while moving the pointer with the larger absolute value.
O(n) time and O(n) output space.
package main
func sortedSquares(nums []int) []int {
result := make([]int, len(nums))
left, right := 0, len(nums)-1
for write := len(nums) - 1; write >= 0; write-- {
if absSquare(nums[left]) > absSquare(nums[right]) {
result[write] = nums[left] * nums[left]
left++
} else {
result[write] = nums[right] * nums[right]
right--
}
}
return result
}
func absSquare(value int) int {
if value < 0 {
return -value
}
return value
}
class Solution:
def sortedSquares(self, nums: list[int]) -> list[int]:
result = [0] * len(nums); left, right = 0, len(nums) - 1
for write in range(len(nums) - 1, -1, -1):
if abs(nums[left]) > abs(nums[right]): result[write], left = nums[left] ** 2, left + 1
else: result[write], right = nums[right] ** 2, right - 1
return result
function sortedSquares(nums: number[]): number[] {
const result = new Array<number>(nums.length);
let left = 0; let right = nums.length - 1;
for (let write = nums.length - 1; write >= 0; write -= 1) { if (Math.abs(nums[left]) > Math.abs(nums[right])) { result[write] = nums[left] ** 2; left += 1; } else { result[write] = nums[right] ** 2; right -= 1; } }
return result;
}