Определение наличия вертикальной оси симметрии для множества точек

Если вертикальная ось существует, её удвоенная координата равна min(x) + max(x). Для каждой точки (x,y) проверьте отражение (sum_x-x,y), сохраняя кратность совпадающих точек.

Короткий ответ

Что ответить на собеседовании

Если вертикальная ось существует, её удвоенная координата равна min(x) + max(x). Для каждой точки (x,y) проверьте отражение (sum_x-x,y), сохраняя кратность совпадающих точек.

Подробный разбор

Ответ с пояснениями

Условие

Дан список точек с целочисленными координатами (x, y). Необходимо выяснить, существует ли вертикальная прямая, которая делит все точки, не находящиеся на этой прямой, на две группы, являющиеся зеркальными отражениями друг друга относительно этой прямой. Группы считаются зеркальными, если каждая точка из исходного списка имеет соответствующую пару в другой группе.

def is_symmetrical(pts: list[tuple[int, int]]) -> bool:
    ...

Ответ

Если вертикальная ось существует, её удвоенная координата равна min(x) + max(x). Для каждой точки (x,y) проверьте отражение (sum_x-x,y), сохраняя кратность совпадающих точек.

Проверка без ошибок вещественного округления:

def is_symmetrical(pts):
    if not pts:
        return True
    counts = {}
    for point in pts:
        counts[point] = counts.get(point, 0) + 1
    axis_sum = min(x for x, y in pts) + max(x for x, y in pts)
    return all(counts.get((axis_sum - x, y), 0) == count
               for (x, y), count in counts.items())

Ось может проходить через полуцелую координату. Точки на ней отражаются сами в себя. Время ожидаемо O(n), память O(n). Если вход действительно математическое множество без кратностей, достаточно set.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее