zoukankan      html  css  js  c++  java
  • 剑指offer-递归和循环

    1. 斐波那契数列

    解:

    没啥好说的了,直接上高效的滚动迭代解法。矩阵解法和特征根解法这里不讨论了。

    class Solution:
        def Fibonacci(self, n):
            # write code here
            if n <= 1:
                return n
            dp_0, dp_1 = 0, 1
            for i in range(2, n+1):
                dp_0, dp_1 = dp_1, dp_0 + dp_1
            return dp_1
    

      

    2. 跳台阶

    一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。

    解:

    这题其实就是斐波那契数列。写一下暴力递归之外的解法。

    递归+记忆化,自顶向下。

    class Solution:
        def jumpFloor(self, number):
            # write code here
            memo = [0] * (number + 1)
            def helper(n, memo):
                if n <= 2:
                    memo[n] = n
                    return memo[n]
                if memo[n] > 0:
                    return memo[n]
                ans = helper(n-1, memo) + helper(n-2, memo)
                memo[n] = ans
                return memo[n]
            return helper(number, memo)
    

      

    动态规划,自底向上,状态转移依赖简单,不需要开一维数组。

    class Solution:
        def jumpFloor(self, number):
            # write code here
            if number <= 2:
                return number
            f1, f2 = 1, 2
            for i in range(3, number+1):
                res = f1 + f2
                f1 = f2
                f2 = res
            return res
    

      

    3.变态跳台阶

    一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

    解:

    f(n) = f(n-1) + f(n-2) + ... + f(n-(n-1)) + f(n-n)。n = 1时只有一种跳法,f(1) = 1;n = 2时只有两种,f(2) = 2 = f(2-1) + f(2-2)。显然f(n-1) = f(n-2) + f(n-3) + ... + f(1) +f(0),递推公式为f(n) = 2*f(n-1)。

    递归实现

    class Solution:
        def jumpFloorII(self, number):
            if number == 1:
                return 1
            return 2*self.jumpFloorII(number-1)
    

      

    f(n) = 2*f(n-1) = 2*2*f(n-2) = ... = 2n-1

    class Solution:
        def jumpFloorII(self, number):
            # write code here
            return 2**(number-1)
    

      

    4. 矩形覆盖

    我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?

    解:

    f(1) = 1, f(2) = 2, f(n)的时候有两种情况,先摆一个竖的,然后有f(n-1)种;先摆两个横的,然后有f(n-2)种,所以还是斐波那契数列。

    class Solution:
        def rectCover(self, number):
            # write code here
            if number <= 2:
                return number 
            fn1 =2
            fn2 = 1
            for i in range(3, number+1):
                res = fn1 + fn2
                fn2 = fn1
                fn1 = res
            return res
    

      

  • 相关阅读:
    PHP保留小数的相关方法
    ASP.NET Core MVC 之过滤器(Filter)
    ASP.NET Core MVC 之控制器(Controller)
    ASP.NET Core MVC 之视图组件(View Component)
    ASP.NET Core MVC 之局部视图(Partial Views)
    标签助手(TagHelper)
    ASP.NET Core MVC 之布局(Layout)
    ASP.NET Core MVC 之视图(Views)
    ASP.NET Core MVC 之模型(Model)
    九卷读书:淘宝从小到大的发展 -重读《淘宝技术这十年》
  • 原文地址:https://www.cnblogs.com/chaojunwang-ml/p/11439074.html
Copyright © 2011-2022 走看看