Ctrl K

Замки между соседями

Средняя
Дан массив values, в котором встречаются только числа 1, 2 и 3, и массив locks той же длины из нулей и единиц. Соседние элементы на позициях i и i + 1 можно поменять местами, только если левый ровно на единицу больше правого (values[i] - values[i + 1] == 1) и замок i открыт (locks[i] == 0). Такие обмены можно делать сколько угодно раз. За одну операцию можно открыть любой замок, то есть сделать locks[i] равным 0. Верните минимальное число операций, после которого values можно отсортировать по неубыванию, или -1, если это невозможно даже со всеми открытыми замками.
Пример 1
values=[2, 1, 3, 2], locks=[1, 0, 1, 1] → 2

Двойку и единицу на позициях 0–1 нужно поменять, поэтому замок 0 открываем. Тройку и двойку на позициях 2–3 тоже нужно поменять — открываем замок 2. Итого 2.

Пример 2
values=[1, 3, 2, 1], locks=[0, 0, 0, 0] → -1

Тройка стоит левее последней единицы, а напрямую тройку с единицей менять нельзя, так что отсортировать не выйдет.

Пример 3
values=[1, 1, 2, 3], locks=[1, 1, 1, 1] → 0

Ряд уже отсортирован, открывать ничего не нужно.

Ограничения
  • 1 ≤ len(values) ≤ 10⁵
  • values[i] ∈ {1, 2, 3}
  • len(locks) = len(values)
  • locks[i] ∈ {0, 1}
Встречал эту задачу на настоящем собесе?
Решили0
Пробовали0
Отправок0
Принято—
Темы
Похожие задачиСудоку без конфликтов СредняяРазложить анаграммы по группам СредняяНулевые кресты СредняяДерево по прямому и симметричному обходам СредняяДерево по симметричному и обратному обходам Средняя
загружаем Python…
Вход
values=[2, 1, 3, 2], locks=[1, 0, 1, 1]
Ожидается
2

«Запустить» — первые 3 теста у тебя в браузере, «Отправить» — все 139 тестов на сервере, включая скрытые.