Рубрики
Без рубрики

Концептуальные решения и библиотечные решения с «Пиковым индексом в массиве долины».

Это часть моей серии, где я объясняю подходы к решению проблем кодирования. Это чтобы помочь мне … Tagged LeetCode, JavaScript, проблемы, новички, новички.

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

Постановка задачи:

Давайте назовем массив горой, если следующие свойства удерживают: A.Length Существует немного 0 тако, что A [0] a [i+1]> ...> a [a.length - 1] Учитывая массив, который определенно является горой, верните любое я, что [0] a [i+1]> ...> a [a.length - 1] Анкет

Что -то вроде дураки, верно? Не волнуйся, мы разбим это!

Подход: Нам нужно искать точку в массиве, где гора перестает расти. Мы можем сделать это 3 способами:

  1. Сканируйте массив, пока мы не достигнем точки, где A [i]> a [i + 1] Анкет Это означает, что гора перестала расти. Мы определенно можем сделать это с помощью двоичного поиска ( Вот базовый обзор ).
  2. Пиковой индекс, по сути, является максимум массива. Мы также можем найти это и вернуть его индекс.

Мы будем продолжать два возможных решения и обмен на обоих.

Решение 1: рекуртивный бинарный поиск

// Time complexity: O(log(n))
// Space complexity: O(n)
const peakIndexInMountainArray = (A, low = 0, high = A.length - 1) => {
    if (!A.length) 
        return -1

    const mid = ((low + high) / 2) | 0

    if (A[mid] > A[mid - 1] && A[mid] > A[mid + 1])
        return mid

    if (A[mid] < A[mid - 1]) 
        return peakIndexInMountainArray(A, low, mid)

    if (A[mid] < A[mid + 1])
        return peakIndexInMountainArray(A, mid, high)
}

Объяснение: Здесь мы добавляем дополнительные аргументы низкий и высокая Как способ отслеживать начальные низкие и высокие значения. низкий изначально 0 и Высокий это A.Length - Анкет

Рекурсивные решения имеют функции, которые вызывают себя снова и снова, пока не найдут необходимое решение. В этом случае мы позвоним PeakIndexinMountainarray Снова и снова, пока мы не найдем индекс пика.

Рекурсивное решение может быть одним из интуитивно понятных способов решения этого, поскольку мы повторяем шаги для небольших частей массива. Это также обеспечивает решение Readalbe, которое легко понять.

  1. Если массив пуст, верните -1, так как нет ничего, чтобы искать
  2. Найдите среднюю точку массива с формулой расстояния (низкий + высокий)/2 а затем усечь десятичное значение, используя бить или:

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

  4. Если это меньше, чем предыдущий номер, мы будем искать нижняя половина рекурсивно с середина Стать новой высшей точкой:

  5. Если это меньше, чем следующий номер, мы будем искать Верхняя половина рекурсивно с середина Стать новой низкой точкой:

С рекурсивными решениями в целом мы должны рассмотреть, как называется « Стек вызовов “. Каждый раз, когда мы называем функцию, она втягивается в стек вызовов- Вот как мы отслеживаем все наши рекурсивные вызовы, поэтому пространственная сложность o (n). После того, как мы нажмите на наш базовый корпус, мы можем выпить вызов функции из стека и передать решение, извлеченное из последнего вызова, к PeakIndexinMountainArray () Анкет

Решение 2: Super Fun One Liner!

// Time complexity: O(n)
// Space complexity: O(1)
const peakIndexInMountainArray = A => {
    return A.indexOf(Math.max(...A))
}

Объяснение: Мы знаем, что индекс пика – это максимум массива, так что это может быть хорошим семантическим подходом для поиска решения!

  1. С тех пор Math.max () Принимает несколько аргументов, которые мы используем Синтаксис спреда Чтобы добавить все значения массива в метод. Тогда это даст нам макс.
  2. Теперь, когда у нас есть макс, мы будем использовать Array.indexof () Чтобы вернуть индекс горной вершины.

Самое крутое в JavaScript – это способность придумывать забавные вкладыши в верхней части других решений! Приятно подумать о подходах, которые не зависят от библиотечных методов на случай, если ваш интервьюер хочет увидеть ваше понимание концепции. Библиотечные методы не только помогают понять функциональность JavaScript, они также помогают думать об этих понятиях по -разному и кратко.

Спасибо за чтение! Как всегда вопросы, обратная связь и идеи всегда поощряются. Счастливого взлома!

Оригинал: “https://dev.to/elisabethdiang/conceptual-solutions-vs-one-liner-solutions-with-leetcode-s-peak-index-in-valley-array-problem-3loj”