Ctrl K

Поиск ценового шаблона в длинной истории

Сложная
В массиве prices записана цена акции по дням — история может быть очень длинной. Аналитик описывает интересующую его динамику массивом trend из чисел -1, 0 и 1: 1 — на следующий день цена выросла, 0 — не изменилась, -1 — упала. Отрезок из len(trend) + 1 подряд идущих дней подходит под шаблон, если для каждого j переход от его j-го дня к следующему ведёт себя так, как говорит trend[j]. Верните количество подходящих отрезков. Отрезки могут пересекаться. Перебор всех отрезков с проверкой шаблона целиком здесь слишком медленный — нужно решение за время, линейное от len(prices) + len(trend).
Пример 1
prices=[4, 6, 6, 2, 3, 8, 8, 5, 5], trend=[1, 0, -1] → 2

Шаблон «вверх, без изменений, вниз» подходит отрезкам [4, 6, 6, 2] и [3, 8, 8, 5].

Пример 2
prices=[1, 2, 3, 4, 5], trend=[1, 1] → 3

Два роста подряд: [1, 2, 3], [2, 3, 4] и [3, 4, 5] — отрезки могут пересекаться.

Пример 3
prices=[7, 7], trend=[-1] → 0
Ограничения
  • 2 ≤ len(prices) ≤ 10⁶
  • 1 ≤ prices[i] ≤ 10⁹
  • 1 ≤ len(trend) < len(prices)
  • trend[j] — одно из чисел -1, 0, 1
Встречал эту задачу на настоящем собесе?
Решили0
Пробовали0
Отправок0
Принято—
Темы
Похожие задачиСлова-рамки СложнаяФраза из начал слов: длинная версия СложнаяПоиск ценового шаблона СредняяСлова-обложки ЛёгкаяЦель из начал слов Средняя
загружаем Python…
Вход
prices=[4, 6, 6, 2, 3, 8, 8, 5, 5], trend=[1, 0, -1]
Ожидается
2

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