美文网首页
剑指offer 动态规划 斐波拉契数列 跳台阶 变态跳台阶 矩阵

剑指offer 动态规划 斐波拉契数列 跳台阶 变态跳台阶 矩阵

作者: GhostintheCode | 来源:发表于2020-01-16 22:56 被阅读0次

    剑指offer 动态规划 Python and C++

    1、斐波拉契数列
    2、跳台阶
    3、变态跳台阶
    4、矩阵覆盖

    斐波拉契数列

    题目描述

    大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。
    n<=39

    思路

    斐波拉契数列:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3,n∈N*)

    只需定义两个整型变量,b表示后面的一个数字,a表示前面的数字即可。每次进行的变换是: a,b = b,a+b

    python

    # -*- coding:utf-8 -*-
    class Solution:
        def Fibonacci(self, n):
            # write code here
            if n<=0:
                return 0
            a = b = 1
            for i in range(2, n):
                a, b = b, a+b
            return b
    

    C++

    class Solution {
    public:
        int Fibonacci(int n) {
            if(n<=0)
                return 0;
            int a =1;
            int b = 1;
            for(int i=2;i<n;i++)
            {
                int temp;
                temp = a +b;
                a = b;
                b = temp;
            }
            return b;
        }
    };
    

    跳台阶

    题目描述

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

    思路

    其实和斐波拉契差不多,青蛙上第一个台阶的时候,是一种方法,第二个台阶的时候是两种分法,第一种就是,走两个一阶梯,或者一次走两个阶梯,两种方法。第三个台阶的时候,是从第一个台阶的方法,加上从第二个台阶来的,

    python

    # -*- coding:utf-8 -*-
    class Solution:
        def jumpFloor(self, number):
            # write code here
            if number<=0:
                return 0
            if number==1:
                return 1
            a = 1
            b = 2
            for i in range(2, number):
                a , b = b, a+b
            return b
    

    C++

    class Solution {
    public:
        int jumpFloor(int number) {
            if (number==0)return 0;
            if (number==1)return 1;
            if (number==2) return 2;
            int b=2;
            int a=1;
            int temp;
            for(int i=3;i<=number;i++)
            {
                temp = a + b;
                a = b;
                b = temp;
            }
            return temp;
        }
    };
    

    变态跳台阶

    题目描述

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

    思路

    n=0时,f(n)=0;n=1时,f(n)=1;n=2时,f(n)=2;假设到了n级台阶,我们可以n-1级一步跳上来,也可以不经过n-1级跳上来,所以f(n)=2*f(n-1)。

    推公式也能得出:

    n = n时:f(n) = f(n-1)+f(n-2)+...+f(n-(n-1)) + f(n-n) = f(0) + f(1) + f(2) + ... + f(n-1)

    由于f(n-1) = f(0)+f(1)+f(2)+ ... + f((n-1)-1) = f(0) + f(1) + f(2) + f(3) + ... + f(n-2)

    所以f(n) = f(n-1)+f(n-1)=2*f(n-1)

    python

    # -*- coding:utf-8 -*-
    class Solution:
        def jumpFloorII(self, number):
            # write code here
            if number<=0:
                return 0
            elif number ==1:
                return 1
            a = 1;
            for i in range(1, number):
                b = a*2
                a = b
            return b
                
    

    C++

    class Solution {
    public:
        int jumpFloorII(int number) {
            if (number<=0)
                return 0;
            else if (number == 1)
                return 1;
            int a = 1;
            int b = 2;
            for(int i = 1; i<number; i++)
            {
                b = 2*a;
                a = b;
            }
            return b;
        }
    };
    

    矩阵覆盖

    题目描述

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

    思路

    和跳台阶的一样的思路,或者看这个人写的挺好的。
    https://www.nowcoder.com/questionTerminal/72a5a919508a4251859fb2cfb987a0e6?answerType=1&f=discussion

    python

    # -*- coding:utf-8 -*-
    class Solution:
        def rectCover(self, number):
            # write code here
            if number<=0:
                return 0
            if number==1:
                return 1
            a = 1
            b = 2
            for i in range(2, number):
                a , b = b, a+b
            return b
    

    C++

    class Solution {
    public:
        int rectCover(int number) {
            if (number==0)return 0;
            if (number==1)return 1;
            if (number==2) return 2;
            int b=2;
            int a=1;
            int temp;
            for(int i=3;i<=number;i++)
            {
                temp = a + b;
                a = b;
                b = temp;
            }
            return temp;
        }
    };
    

    相关文章

      网友评论

          本文标题:剑指offer 动态规划 斐波拉契数列 跳台阶 变态跳台阶 矩阵

          本文链接:https://www.haomeiwen.com/subject/hwrtzctx.html