Различные подходы к решению этой проблемы в JavaScript
Постановка проблемы:
Учитывая массив
arr, замените каждый элемент в этом массиве самым большим элементом среди элементов справа от него и замените последний элемент на-1. После этого верните массив.
Итак, как мы можем решить эту проблему?
Подход 1.Использование встроенных функций в JavaScript
- Инициализировать пустой массив
result. - Перебрать входной массив, кроме последнего элемента. Нам не нужно проверять последний элемент, так как он всегда будет заменен на -1.
- Для каждого индекса
iцикла во входном массиве установитеresult[i]на следующий максимальный элемент справа. - Следующий максимум находится с помощью
Math.max(),.slice()и... (spread operator).
// ES6 Arrow Function
const replaceMaxRight = arr => {
const result = [];
for(let i = 0; i < arr.length; i++) {
result[i] = Math.max(...arr.slice(i+1));
}
result[result.length - 1] = -1;
return result;
}
Временная сложность:O(N²)
Пространственная сложность:O(N)
Примечание. Хотя предыдущее решение работает, оно не самое эффективное, поскольку его временная сложность составляет O(N²). Однако мы можем улучшить временную сложность до O(N), перебирая массив справа налево. Давайте посмотрим на это в нашем втором подходе к решению этой проблемы.
Подход 2. Повторение входного массива справа налево.
- Инициализируйте переменную с именем
maxна-1. Эта переменная будет отслеживать максимальное количество найденных элементов. - Повторите входной массив
arr, начиная с самого правого элемента, потому что мы хотим отслеживать максимальное количество элементов, встречающихся до сих пор с правой стороны. - Для каждой итерации инициализируйте переменную и сохраняйте значение элемента с текущим индексом
arr[i]в эту переменную. - Затем мы установим значение текущего индекса во входном массиве
arr[i]на максимальное значение, которое мы видели до сих пор, которое хранится в переменнойmax. - Наконец, мы обновим значение переменной
max, сравнив текущее максимальное значение со значением, которое мы сохранили на шаге 3. Если сохраненное нами значение больше текущего максимального значения, мы соответствующим образом обновим переменнуюmax.
// ES6 Arrow Functions
const replaceMaxRight = arr => {
let max = -1;
for(let i = arr.length - 1; i >= 0; i--) {
let curr = arr[i];
arr[i] = max;
max = Math.max(max, curr);
}
return arr;
}
Временная сложность:O(N)
Пространственная сложность:O(1)
Примечание.Еще один способ кодирования проблемы, который немного отличается от второго подхода.
// ES6 Arrow Function
const replaceMaxRight = arr => {
let max = arr[arr.length - 1];
arr[arr.length - 1] = -1;
for(let i = arr.length - 2; i >= 0; i--) {
let curr = arr[i];
arr[i] = max;
if(curr > max) max = curr;
}
return arr;
}
Примечание.Время и Пространство сложности остаются такими же, как и в подходе 2.
Я надеюсь, что эта статья предоставила вам ценную информацию и помогла вам лучше понять различные подходы к решению этой проблемы. Удачного кодирования!
Проблема - Leetcode 1299