Давайте начнем с размышления над важной деталью проблемы: если две строки содержат столбец, который различается по строкам (например, в одной строке это ноль, а в одной строке это единица), то нет возможности способ сделать обе строки все едиными. Чтобы увидеть это, предположим, что строка x имеет ноль в некотором столбце, а строка y - единицу в этом столбце. Тогда, если мы не перевернем этот столбец, строка x не может быть всеми единицами, а если мы перевернем столбец, то строка y не может быть всеми единицами. Следовательно, если мы посмотрим на исходную матрицу и попытаемся подумать о том, какие строки мы собираемся создать, мы, по сути, просто выберем некоторый набор строк, которые все равны друг другу. Наша цель состоит в том, чтобы выбрать набор одинаковых строк, который будет максимально большим и может быть превращен во все, используя ровно k сальто. Допустим, что строка, которая может быть преобразована во все с использованием ровно k переворотов, является «строкой-кандидатом». Тогда нам просто нужно найти строку-кандидат в матрице, которая появляется наибольшее количество раз.
Фактический алгоритм для этого зависит от того, разрешено ли нам дважды переворачивать один и тот же столбец. Если нет, то строка-кандидат содержит ровно k нулей. Если мы можем перевернуть один и тот же столбец несколько раз, то это немного сложнее. Чтобы все строки были единичными, нам нужно преобразовать каждый ноль в единицу, а затем продолжать тратить оставшиеся сальто, переворачивая один и тот же столбец дважды, чтобы не менять ни один на ноль. Это верно, если разница между k и числом нулей в строке является неотрицательным четным числом.
Используя это, мы получаем следующий алгоритм:
- Поддерживать отображение хеш-таблицы из строк-кандидатов на их частоту.
- Для каждого ряда:
- Подсчитать число или нули в строке.
- Если разница между k и этим числом является неотрицательным четным числом, обновите хеш-таблицу, увеличив частоту этой конкретной строки.
- Найдите строку-кандидат в хеш-таблице с наибольшей общей частотой.
- Вывести частоту этого ряда.
В целом, на матрице m x n (m строк, n столбцов) мы посещаем каждую строку один раз. Во время посещения мы выполняем O (n) работу, чтобы посчитать количество нулей, а затем O (1), чтобы проверить, действительно ли это. Если это так, то для обновления хеш-таблицы требуется ожидаемое время O (n), поскольку для хэширования строки требуется шаг O (n). Это означает, что мы тратим O (mn) времени на заполнение таблицы. Наконец, последний шаг занимает время O (m), чтобы найти строку максимальной частоты, для чистого времени выполнения O (mn), которое является линейным по размеру входа. Более того, это асимптотически оптимально, так как, если бы мы потратили меньше времени, чем это, мы не могли бы смотреть на все элементы матрицы!
Надеюсь, это поможет! Это крутая проблема!