Проверяйте одновременно две возможности: неубывание и невозрастание. Если встретились и рост, и падение, массив не монотонен; равные соседние значения ничего не нарушают.
Определение монотонности числового массива
Проверяйте одновременно две возможности: неубывание и невозрастание. Если встретились и рост, и падение, массив не монотонен; равные соседние значения ничего не нарушают.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Дан массив целых чисел. Требуется реализовать функцию, которая возвращает true, если массив строго либо нестрого монотонно возрастает, либо строго либо нестрого монотонно убывает. В остальных случаях функция должна вернуть false.
def is_monotonic(nums: List[int]) -> bool:
# реализуйте проверку монотонности
pass
public static boolean isMonotonic(int[] numbers) {
// реализуйте проверку монотонности
return false;
}
bool isMonotonic(const std::vector<int>& arr) {
// реализуйте проверку монотонности
return false;
}
Ответ
Проверяйте одновременно две возможности: неубывание и невозрастание. Если встретились и рост, и падение, массив не монотонен; равные соседние значения ничего не нарушают.
public static boolean isMonotonic(int[] numbers) {
boolean nonDecreasing = true, nonIncreasing = true;
for (int i = 1; i < numbers.length; i++) {
if (numbers[i] < numbers[i - 1]) nonDecreasing = false;
if (numbers[i] > numbers[i - 1]) nonIncreasing = false;
if (!nonDecreasing && !nonIncreasing) return false;
}
return true;
}
Выбран Java-вариант, в Python/C++ алгоритм тот же. Пустой массив и один элемент считаются монотонными. Время O(n), память O(1). Сравнивайте числа напрямую, не через их разность: вычитание крайних int может переполниться.