Достаточно одного прохода и двух флагов: возможны ли ещё неубывание и невозрастание. Если нарушены оба направления, массив немонотонный.
Проверка массива на монотонность (Is Monotonic)
Достаточно одного прохода и двух флагов: возможны ли ещё неубывание и невозрастание. Если нарушены оба направления, массив немонотонный.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Проверка массива на монотонность (Is Monotonic)
Условие: Реализуйте функцию isMonotonic(numbers), которая принимает массив чисел и определяет, является ли он монотонным — то есть либо полностью не убывающим (каждый следующий элемент больше или равен предыдущему), либо полностью не возрастающим (каждый следующий элемент меньше или равен предыдущему).
Входные данные: numbers — массив целых или вещественных чисел, длина от 0 до 10^5.
Выходные данные: true, если массив монотонный (не убывает ИЛИ не возрастает на всём протяжении), иначе false.
Ограничения:
- 0 ≤ numbers.length ≤ 10^5
- -10^9 ≤ numbers[i] ≤ 10^9
- Массивы длиной 0 или 1 считаются монотонными по определению.
Код для реализации:
# Доступно без импорта: json, sys, io
def is_monotonic(numbers):
# TODO: напишите решение здесь
return True
Ответ
Достаточно одного прохода и двух флагов: возможны ли ещё неубывание и невозрастание. Если нарушены оба направления, массив немонотонный.
def is_monotonic(numbers):
nondecreasing = True
nonincreasing = True
for i in range(1, len(numbers)):
if numbers[i] < numbers[i - 1]:
nondecreasing = False
if numbers[i] > numbers[i - 1]:
nonincreasing = False
if not nondecreasing and not nonincreasing:
return False
return True
Равные соседние элементы не нарушают ни одно направление. Пустой массив и один элемент возвращают True, поскольку цикл не выполняется. Время O(n), дополнительная память O(1). По условию числа находятся в заданном диапазоне; отдельную политику для NaN пришлось бы определить дополнительно.