Отличное решение. Оказывается, что есть много симметрии, и ответ намного проще, чем я первоначально думал. Максимальное количество вещей, которые вы когда-либо можете сделать, - это минимум уникальных X и уникальных Y, который равен O (NlogN), если вы просто хотите получить результат.
Любая другая фигура эквивалентна прямоугольнику, который содержит точки, потому что не имеет значения, сколько точек вы вытягиваете из центра прямоугольника, порядок никогда не будет иметь значения (если обрабатывается, как показано ниже). Любая фигура , с которой вы отбираете точку, теперь имеет один менее уникальный X и один менее уникальный Y, как прямоугольник.
Таким образом, оптимальное решение не имеет ничего общего со связностью. Выберите любую точку, которая находится на краю наименьшего измерения (т. Е. Если len (unique-Xs)> len (unique-Ys), выберите все, что имеет максимальный или минимальный X). Неважно, сколько у него подключений, только то, какое измерение самое большое, что можно легко сделать, глядя на отсортированные уникальные списки, созданные выше. Если вы сохраняете счетчики unique-x и unique-y и уменьшаете их при удалении всех уникальных узлов в этом элементе списка, то каждое удаление равно O (1), а пересчет длин - O (1). Таким образом, повторение этого N раз в худшем случае O (N), а окончательная сложность - O (NlogN) (исключительно из-за сортировки).
Вы можете выбрать любую точку вдоль кратчайшего края, потому что:
- если на этом краю только один, вам лучше выбрать его сейчас, или что-то еще устранит его
- если на этом краю больше одного, кого это волнует, вы все равно убьете их своим выбором
По сути, вы максимизируете "max (uniqX, uniqY)" в каждой точке.
Обновление: IVlad поймал крайний случай:
Если размеры равны, возьмите край с наименьшим количеством точек. Даже если они не равны, возьмите верх или низ уникального стека, из которого вы удаляете, и который имеет наименьшее количество очков.
Показательный пример:
Поворот 1:
- Баллов:
(1, 2); (3, 5); (10, 5); (10, 2); (10, 3)
- Есть 3 уникальных X:
1, 3, 10
- Есть 3 уникальных Y:
2, 3, 5
- "Ограничивающий прямоугольник" равен
(1,5),(10,5),(10,2),(1,2)
Реакция 1:
- "Внешний край" (самый внешний список точек UniqueX или UniqueY), который имеет наименьшее количество точек, является левым. В основном, посмотрите на наборы точек в x = 1, x = 10 и y = 2, y = 5. Набор для x = 1 является наименьшим: одна точка. Выберите единственную точку для х = 1 ->
(1,2)
.
- Это также исключает
(10,2)
.
Поворот 2:
- Баллов:
(3, 5); (10, 5); (10, 3)
- Есть 2 уникальных X:
3, 10
- Есть 2 уникальных Y:
3, 5
- «Ограничивающий прямоугольник» равен
(3,5),(10,5),(10,3),(3,3)
Реакция 2:
- "Край" ограничивающего прямоугольника, который имеет наименьшее значение, находится либо внизу, либо слева. Мы достигли тривиального случая - 4 балла означают, что все ребра являются внешними ребрами. Устранить один. Скажите
(10,3)
.
- Это также исключает
(10,5)
.
Ход 3:
Реакция 3: