Матрица и хеш-таблица

Сложность: средняя

Коэффициент принятия: 46,5 %

Проблема

Перед вами кирпичная стена. Стена прямоугольная и имеет несколько рядов кирпичей. Кирпичи имеют одинаковую высоту, но разную ширину. Вы хотите провести вертикальную линию от верха к низу и пересечь наименьшие кирпичи.

Кирпичная стена представлена ​​списком рядов. Каждая строка представляет собой список целых чисел, представляющих ширину каждого кирпича в этой строке слева направо.

Если ваша линия проходит через край кирпича, то кирпич не считается пересеченным. Вам нужно выяснить, как нарисовать линию, чтобы пересечь наименьшее количество кирпичей и вернуть количество пересеченных кирпичей.

Вы не можете провести линию только вдоль одного из двух вертикальных краев стены, и в этом случае линия, очевидно, не будет пересекать кирпичи.

Мысли:

Эта проблема довольно прямолинейна.

Первые две вещи, которые нам нужно знать, это ширина и высота стены. Из ширины и высоты мы могли бы сначала создать матрицу, подобную этой:

Каждый «0» означает, что пространство заблокировано кирпичом.
Мы хотим, чтобы матрица стала примерно такой:

где 1 означает пересечение между двумя кирпичами (или не пересечение).
Итак, что мы делаем, так это находим максимальное количество сложенных единиц среди столбцов.

Полный метод выглядит так:

Это работоспособное решение, но это также и TLE.

Сложность этого решения в основном составляет O( n² ), но сначала мы создаем матрицу, а также есть другие циклы for, из-за чего время выполнения превышает ограничение по времени.

Кажется, что матрица для этого не подходит, поэтому давайте сделаем это в виде хеш-таблицы.

В строке 3 мы сначала создаем словарь, чтобы отметить, сколько кирпичей НЕ пересекается в каждом столбце,

Затем мы проходим через кирпичную стену, мы знаем, что в колонне не будет кирпича, когда колонна находится между кирпичами. Замените переменную mostCrossed во время цикла. Сложность этого решения тоже O( n² ), но с помощью хеш-таблицы, видимо, быстрее.