zoukankan      html  css  js  c++  java
  • 《剑指offer》斐波那契数列

      本题来自《剑指offer》 斐波那契数列 矩阵覆盖

    题目一:

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

    思路:

      递归方式:return n<=0 ? 0 : n+fib(n-1)

      递归是由于函数调用自身,有时间和空间的消耗,每次自身的调用都需要在内存栈中分配空间以保存参数,返回地址和变量,而且栈中压入和弹出数据都需要时间,效率不高,如果数据过大,会导致栈内存溢出。但是代码简洁。

      循环方式:O(n)时间内的操作 

      循环是通过设置计算的初始值和终止条件在一个范围内重复运算。采用迭代的方式,从头计算后面的值。

    C++ Code:

    class Solution {
    public:
        int Fibonacci(int n) {                    //采用循环的方式时间为O(n)
            int res[2] = {0,1};                   //初始的两个值【0,1】
            if (n < 2){                           //当n小于2直接返回
                return res[n];    
            }else{
                int fibOne = 0;
                int fibTwo = 1;
                int fib = 0;
                for (unsigned int i = 2;i<=n;i++){
                    fib = fibOne + fibTwo;
                    fibOne = fibTwo;
                    fibTwo = fib;
                }
                return fib;
            }
        }
    };

    Python Code:

    # -*- coding:utf-8 -*-
    class Solution:
        def Fibonacci(self, n):            #采用循环的方式计算
            # write code here
            res = [0,1]                    #n为0和1时候为【0,1】
            if n < 2:                    
                return res[n]              #如果n小于2直接返回
            else:                          #如果n大于2,采用叠加的方式计算
                fibOne = 0
                fibTwo = 1
                fib = 0
                for i in range(2,n+1):    
                    fib = fibOne + fibTwo  #依次计算前面两个值,最终返回
                    fibOne = fibTwo
                    fibTwo = fib
                return fib

    总结:

      本题延伸,比如跳台阶问题,或者汉诺塔问题,都是采用递归方式。

      如果需要重复性的多次计算相同的问题,通常可以采用递归或者循环两种方式。

    题目二:

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

    思路:

      f(n) = f(n-1)+f(n-2)

    Python Code:

    # -*- coding:utf-8 -*-
    class Solution:
        def rectCover(self, number):
            # write code here
            res = [0,1]
            if number < 2:
                return res[number]
            one = 0
            two = 1
            for i in range(number+1):
                one,two = two,one+two
            return one
  • 相关阅读:
    4.graph.h
    3.俄罗斯方块项目
    3.栈的实现
    26.多线程
    25.Detours劫持技术
    codeforces 616E Sum of Remainders (数论,找规律)
    poj2387 Til the Cows Come Home 最短路径dijkstra算法
    poj1274 The Perfect Stall (二分最大匹配)
    poj1459 Power Network (多源多汇最大流)
    Oracle RAC/Clusterware 多种心跳heartbeat机制介绍 RAC超时机制分析
  • 原文地址:https://www.cnblogs.com/missidiot/p/10762100.html
Copyright © 2011-2022 走看看