Я предполагаю, что вы готовы терпеть перекрывающиеся прямоугольники, поскольку, если точки равны
4 .###.
3 ..#..
2 .###.
1 ..#..
0 .###.
01234
тогда вы можете покрыть четырьмя перекрывающимися прямоугольниками, но потребуется пять непересекающихся.
Как насчет этого алгоритма:
Для каждой точки найдите самый большой прямоугольник, содержащий эту точку. Самый большой прямоугольник - это тот, который нельзя сделать больше и все же просто покрыть точки. Если есть два самых больших прямоугольника, просто выберите один. Сохраните этот самый большой прямоугольник в некоторой структуре данных, которая удаляет дубликаты. После того, как вы закончили итерацию по всем точкам, набор прямоугольников должен охватывать все точки.
Я не знаю, действительно ли это минимальный набор прямоугольников, но я подозреваю, что это так.
Обратите внимание, что в приведенном выше примере вы получите три прямоугольника: один вертикальный и два горизонтальных.