Ctrl K

Сдвиг с наибольшим числом очков

Сложная
Дан массив values длины n. Массив можно циклически сдвинуть влево на k позиций (0 ≤ k < n): он станет [values[k], ..., values[n − 1], values[0], ..., values[k − 1]]. После сдвига каждый элемент, значение которого не больше его нового индекса, приносит одно очко. Например, [3, 0, 2, 1] приносит 3 очка: за 0 на индексе 1, 2 на индексе 2 и 1 на индексе 3. Верните сдвиг k, дающий больше всего очков. Если таких несколько, верните наименьший.
Пример 1
values=[2, 0, 1] → 1

Сдвиг 0: [2, 0, 1] — очки за 0 и 1, итого 2. Сдвиг 1: [0, 1, 2] — все три на месте не меньше своего значения, итого 3. Сдвиг 2: [1, 2, 0] — только 0, итого 1. Лучший — сдвиг 1.

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

При любом сдвиге оба нуля приносят очко, поэтому берём наименьший сдвиг — 0.

Пример 3
values=[1, 2, 3, 0] → 3
Ограничения
  • 1 ≤ n = len(values) ≤ 10⁵
  • 0 ≤ values[i] < n
Встречал эту задачу на настоящем собесе?
Решили0
Пробовали0
Отправок0
Принято—
Темы
Похожие задачиСамый доходный участок под лимитом СложнаяСамый тяжёлый день чтения СложнаяЧетыре равных куска СложнаяЛучшее среднее длинного отрезка СложнаяКороткий отрезок с нужной суммой Сложная
загружаем Python…
Вход
values=[2, 0, 1]
Ожидается
1

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