Вариант "туда и обратно", работающий за время O(N) и без вспомогательной памяти
function processDirection(arr, first, end, step) {
let top = -1;
for (let i = first; i !== end; i += step) {
const value = arr[i];
if (value <= top) {
arr[i] = -1;
} else {
top = value;
}
top--;
}
}
function updateArray(arr) {
processDirection(arr, 0, arr.length, 1);
processDirection(arr, arr.length - 1, -1, -1);
return arr;
}
// --------
updateArray([5, 1, 1, 0, 2, 1, 1, 0]); // [5, -1, -1, -1, 2, -1, 1, -1]
Еще вопрос по условию. На массиве [2, 1, 1, 1] результат получается [2, -1, 1, 1].
Предпоследняя единица выживает, потому что она "смотрит дальше", чем двойка. Но эта единица не обращает ни одного нуля (нет нулей, которые она могла бы переделать в -1).
Как надобно понимать условие? Оставлять 1, или менять на -1?
Другие решения дают тот же результат.