一文掌握斐波那契与卡塔兰数(内含python代码)

184 阅读2分钟

前言

在算法题中,最近遇到两个很有意思的算法,直接套公式就可以完成算法解答,那就是斐波那契与卡塔兰数,下面让我们了解这两个公式吧!


斐波那契

斐波那契数列是一个非常著名的数列,它由0和1开始,后面的每一个数字都是前两个数字的和。

数列的前几项是这样的:

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ... 这类问题可以衍生为:爬楼梯的问题,有几节楼梯,每次爬1层或者2层,请问一共有几种爬法? 把这个转化为公式就是f(x)=f(x−1)+f(x−2)

def climbStairs(n):
    if n <= 2:
        return n
    dp = [0] * (n+1)
    dp[1], dp[2] = 1, 2
    for i in range(3, n+1):
        dp[i] = dp[i-1] + dp[i-2]
    return dp[n]
  • dp = [0] * (n+1)就是用来初始化一个数组,用于存储子问题的解。
  • dp[i] = dp[i-1] + dp[i-2]就是斐波那契。 以后遇到类似的问题就可以直接代公式进行编程了!

扩展

卢卡斯数列:这是斐波那契数列的一个变体,定义为 L(n) = L(n-1) + L(n-2),其中 L(0) = 2 和 L(1) = 1。卢卡斯数列与斐波那契数列相似,但起始值不同 。

卡塔兰数

卡塔兰数(Catalan number)是组合数学中的一个数列,广泛应用于各种计数问题。 卡塔兰数的递推关系可以表示为: C 0=1,C n+1= (2(2n+1)/n+2)C n 这个公式表明,第n项卡塔兰数等于从2n个不同元素中选择n个元素的组合数除以n+1 例如:不同的二叉搜索树:n个节点组成且节点值从1到n互不相同的二叉搜索树有多少种?

class Solution(object):
    def numTrees(self, n):
        """
        :type n: int
        :rtype: int
        """
        C = 1
        for i in range(0, n):
            C = C * 2*(2*i+1)/(i+2)
        return int(C)
  • C = C * 2*(2*i+1)/(i+2)就是公式的代码编写。

扩展

Dyck路径:卡塔兰数也与所谓的Dyck路径有关,这些路径是从原点到(2n, 0)的路径,只允许向上一步(1,1)和向右一步(1,-1),并且不允许在任何点位于x轴下方。


总结

leetcode.cn/problems/un…

记住这两个公式,也许哪一天就用上了呢!