Алгоритмы JavaScript: решение последовательности Фибоначчи (LeetCode)

Nov 24 2022
Описание
Числа Фибоначчи, обычно обозначаемые F(n), образуют последовательность, называемую последовательностью Фибоначчи, так что каждое число является суммой двух предыдущих, начиная с 0 и 1. Числа в следующей целочисленной последовательности 0, 1, 1 , 2, 3, 5, 8, 13, 21, 34, 55, 89, …….
Фото Лудде Лоренц на Unsplash

Числа Фибоначчи , обычно обозначаемые как числа, F(n)образуют последовательность, называемую последовательностью Фибоначчи , так что каждое число является суммой двух предыдущих, начиная с 0и 1. Числа в следующей целочисленной последовательности 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ……..

Это

F(0) = 0, F(1) = 1
F(n) = F(n - 1) + F(n - 2), for n > 1.

Пример 1:

Input: n = 2
Output: 1
Explanation: F(2) = F(1) + F(0) = 1 + 0 = 1.

Input: n = 3
Output: 2
Explanation: F(3) = F(2) + F(1) = 1 + 1 = 2.

Input: n = 4
Output: 3
Explanation: F(4) = F(3) + F(2) = 2 + 1 = 3.

  • 0 <= n <= 30

Есть несколько вариантов решения этой проблемы: Рекурсивный подход.

Рекурсивный подход

Простой метод, представляющий собой прямую рекурсивную реализацию математического рекуррентного соотношения. Самый медленный способ решить эту проблему, потому что он требует экспоненциальной временной сложности : O(2^N) и пространственной сложности : O(N) .

Динамическое программирование с использованием мемоизации (подход «сверху вниз»)

Мы можем избежать повторяющейся работы, выполняемой в рекурсивном режиме, сохраняя рассчитанные до сих пор числа Фибоначчи. Нам просто нужно сохранить все значения на карте. Временная сложность : O(N) и пространственная сложность : O(N) .

Итерационный подход

Итерация с решением всех подзадач и возвратом ответа для элемента N с использованием уже вычисленных значений Фибоначчи. Временная сложность : O(N) и пространственная сложность : O(N) .

Итерационный подход ( оптимизированное пространство)

Мы можем оптимизировать итерационный подход, сохраняя два предыдущих числа только потому, что это все, что нам нужно, чтобы получить следующее число Фибоначчи в последовательности. Временная сложность : O(N) и пространственная сложность : O(1) .

Подход матричного возведения в степень

Используйте возведение в степень матрицы, чтобы получить число Фибоначчи из элемента в (0, 0) в результирующей матрице. Чтобы сделать это, мы можем полагаться на матричное уравнение для последовательности Фибоначчи, чтобы найти N-е число Фибоначчи:

Как работает эта формула вы можете посмотреть в Wiki

Это решение имеет: временную сложность : O(logN) и пространственную сложность : O(logN) .

Математический подход

Мы можем использовать golden ratio forumula:

Вот ссылка , чтобы узнать больше о том, как работают последовательность Фибоначчи и золотое сечение.

Это решение имеет: временную сложность : O(logN) и пространственную сложность : O(1) .

Также иногда требуется вернуть не значение для заданного N, а вернуть массив элементов Фибоначчи вплоть до заданного N.

Пример:

Input: n = 7
Output: [0, 1, 1, 2, 3, 5, 8, 13]

и динамическое программирование с использованием запоминания с небольшими изменениями:

Мы рассмотрели разные варианты решения задачи Фибоначчи, самый сложный для понимания — Матричное возведение в степень, но обычно для собеседования достаточно знания 4-х предыдущих методов.

Надеюсь, это было полезно для вас!

Спасибо за прочтение! Увидимся.

Больше контента на PlainEnglish.io . Подпишитесь на нашу бесплатную еженедельную рассылку . Следите за нами в Twitter , LinkedIn , YouTube и Discord . Заинтересованы в хакинге роста? Проверьте Цепь .