Подумайте о заглушке. Этот метод имеет O (m + n) сложность для всех случаев.
Объедините каждую «сделку» в набор правил, затем переберите предметы, добавив их в каждую дыру, правила которой они удовлетворяют.
Затем просматривайте сделки, вытаскивая предметы из подоконников, если они там есть.
Пример:
"blue car", "red car", "yellow expensive car", "red expensive car", "cheap car"
Предложения:
buy a red car, get a blue car for free
buy an expensive car, get a cheap car for free
«Правила», которые мы можем вывести:
is_red, is_expensive, is_blue, is_cheap
Итак, у нас есть 2 отверстия: is_red и is_exорого. Проходите по элементам, добавляя их во все отверстия, правила которых они удовлетворяют, и в результате получаются следующие отверстия:
is_red ( "red car", "red expensive car" )
is_expensive ( "red expensive car", yellow expensive car" )
is_blue ( "blue car" )
is_cheap ( "cheap car" )
Затем пройдитесь по сделкам:
buy a red car, get a blue car for free
is_red contains "red car", is_blue contains "blue car", so:
pop them from the holes and make them a deal
Следующая сделка:
buy an expensive car, get a cheap car for free
is_expensive doesn't contain any cars