January 19, 2019

Leetcode.com, задача №70. "Подъём по лестнице". Часть 2.


!!НАШ БЛОГ ПЕРЕЕХАЛ!!

Мы создали свой сайт! Все материалы, опубликованные в этом блоге, переехали туда.

Наш новый сайт maddevelop.ru

А данную статью вы можете найти по ссылке


Условие

Вы поднимаетесь по лестнице высотой n ступенек. За один шан Вы можете подняться или на 1 ступеньку, или на 2. Сколько вариантов подъёма существует?

Решение №4, число Фибоначчи

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

public static int ClimbStairs(int n)
{
  if (n == 1)
    return 1;
  int first = 1;
  int second = 2;
  int third = 0;
  for (int i = 3; i <= n; i++)
  {
    third = first + second;
    first = second;
    second = third;
  }
  return third;
}

Временная сложность алгоритма: n. Используется цикл с n итерациями.

Пространственная сложность: 1. В программе используем всего лишь три переменных, сложность постоянна и не зависит от n.

Решение №5, метод Бине

В этом методе для нахождения n-го числа Фибоначчи используется матричное перемножение.

Временная сложность алгоритма: двоичный логарифм n.

Пространственная сложность: 1.

Решение №6, формула для расчёта числа Фибоначчи

Можно не вычислять самостоятельно число Фибоначчи, а воспользоваться следующей формулой:

public static int ClimbStairs(int n)
{
  double sqrt5 = Math.Sqrt(5);
  double fibn = Math.Pow((1 + sqrt5) / 2, n + 1) - Math.Pow((1 - sqrt5) / 2, n + 1);
  return (int)(fibn / sqrt5);
}

Временная сложность алгоритма: двоичный логарифм n. Столько времени занимает операция возведения в степень (Math.Pow).

Пространственная сложность: 1.

Источник:

https://leetcode.com/problems/climbing-stairs



Ещё больше интересной информации на нашем Telegram канале.