Напишите функцию, которая проверяет, можно ли сделать массив целых чисел неубывающим, изменив не более одного элемента.

nums = [1, 2, 3]
--> True (since already in non-decreasing order)
nums = [3, 2, 1]
--> False (since need to modify at least 2 elements)
nums = [1, 2, 0]
--> True (since can just modify last element)
nums = [2, 3, 1, 2]
--> False (since need to modify at least 2 elements)

Сможете ли вы сделать это за O(n) времени и O(1) пространства? Возьмите ручку и бумагу и попробуйте.

Рассуждение

Элемент a[i] проблематичен, когда он > a[i+1]. Это означает, что необходимо изменить либо a[i], либо a[i+1].

Через один проход, если мы находим более 1 проблемного элемента, это означает, что нам нужно изменить как минимум 2 элемента. Следовательно, мы можем безопасно вернуть false .

Если мы находим только один проблемный элемент, это не значит, что мы всегда можем сделать одно изменение в массиве, чтобы сделать его неубывающим.

nums = [2, 3, 1, 2]
based on the a[i] > a[i+1] check, there is only one problematic element, which is 3, but we cannot simply modify one element in the array to make it non-decreasing

Итак, мы должны выяснить условия, которые позволяют только одну модификацию, если есть только один проблемный элемент.

В приведенных ниже примерах показаны различные условия. Ось Y представляет возрастающие числа, а ось X представляет индекс массива. a представляет массив.

a[i+1] — последний элемент. В этом случае мы можем просто изменить последний элемент на >= a[i].

a[i] — первый элемент. В этом случае мы можем просто изменить его на <= a[i+1] .

a[i-1] <= a[i+1] . В этом случае мы можем изменить a[i] так, чтобы он находился между его соседями.

a[i] <= a[i+2] . В этом случае мы можем изменить a[i+1] так, чтобы он находился между его соседями.

Решение в коде

Этот вопрос учит нас думать о различных перестановках массива и наблюдать за случаями, когда возможна одна модификация.

Существует ли лучшее решение? Озвучьте в комментариях ниже.

Надеюсь, вам понравилось.

Спасибо.

Вечнозеленое кодирование