---
round: 1
ticket_no: 5
source_no: 3
slug: squares-of-a-sorted-array
topic: Two Pointers
difficulty: Easy
leetcode_id: 977
attempted: true
score: 2
verdict: partial
reviewed_at: 2026-09-12
---

# Билет 05 — Squares of a Sorted Array

## Условие (как предъявлено)

Дан массив целых чисел `nums`, отсортированный в неубывающем порядке (среди элементов могут быть отрицательные). Вернуть массив квадратов этих чисел, также отсортированный в неубывающем порядке. Follow-up: сделать за `O(n)` без использования сортировки.

```
Input:  nums = [-4,-1,0,3,10]  →  [0,1,9,16,100]
Input:  nums = [-7,-3,2,3,11]  →  [4,9,9,49,121]
```

Constraints: `1 <= n <= 10^4`, `-10^4 <= nums[i] <= 10^4`.

## Ответ

> Тут идея состоит в том, что квадрат как с хвоста, так и с головы могут быть достаточно большими, потому что отрицательных чисел эти квадраты тоже положительны. Поэтому мы должны тут сделать два указателя, которые идут с двух сторон. Мы проверяем хвост, получается, и голову, квадраты там-там возводим, смотри, где больше, и добавляем в результат. Добавляем результат, вот и тот, который мы зяли, мы его сдвигаем, вот и дальше сравниваем уже новые значения. Наставка и уНо тут есть тонкость, то есть, там получается, тогда нужно сделать реферсирование этого массива, что уже не очень хорошо. В данном случае тогда можно сделать следующее: можно пройтись по массиву и найти минимальный элемент. И дальше уже начать отсчитывать квадраты двумя указателями от центра в разные стороны. И тогда у нас будет нарастающий как раз массив в результате.

## Разбор

**Что верно:** максимальный квадрат всегда на одном из концов массива; два указателя снаружи внутрь, сравнение квадратов — верно. Замечена проблема варианта «заполнять с начала и разворачивать».

**Что упущено и ошибки:** предложен обход от минимума наружу, хотя проще писать результат с конца: тогда реверс не нужен и не нужен отдельный поиск минимума. Обход от центра тоже O(n), но требует поиска минимума и легче ошибиться в индексах. Не названы сложность и граничные случаи.

**Эталонная идея:** l = 0, r = n-1, res = Array.new(n), idx = n-1; сравниваем nums[l]**2 и nums[r]**2, больший пишем в res[idx], idx -= 1, двигаем взятую сторону.

**Сложность:** время O(n), память O(n) на результат

**Критерии:** идея ✅ · структура данных ✅ · сложность ❌ · граничные случаи ⚠️


**Разбор задачи:** [`../../algo-solutions/01-must-have/01-two-pointers/03-squares-of-a-sorted-array.md`](../../algo-solutions/01-must-have/01-two-pointers/03-squares-of-a-sorted-array.md)
