牛客网 《剑指offer》

时间限制:1秒 空间限制:32768K 热度指数:199742 解题思路 一: 如果像这样,将会有大量的计算是重复的,时空复杂度过大

二: 可以考虑将计算过的结果缓存起来,如果发现一个 n 已经计算过了,就不再重复计算 三: 非递归解法,即从下往上算 首先根据 f(0)和 f(1) 算出 f(2),再根据f(1) 和 f(2)算出f(3)。。。以此类推 python 2.7 递归

-- coding:utf-8 --

class Solution: def init(self): self.dic = {0:0, 1:1}

def Fibonacci(self, n):
    # write code here
    if n < 0:
        return None
    if self.dic.has_key(n):
        return self.dic[n]
    m1 = self.getF(n - 1)
    if not m1:
        m1 = self.Fibonacci(n - 1)
        self.dic[n - 1] = m1

    m2 = self.getF(n - 2)
    if not m2:
        m2 = self.Fibonacci(n - 2)
        self.dic[n - 2] = m2
    return m1 + m2 

def getF(self, n):
    if self.dic.has_key(n):
        return self.dic[n]
    return None

运行时间:28ms 占用内存:5768k

https://github.com/Jack-Lee-Hiter/AlgorithmsByPython/blob/master/Target%20Offer/%E6%96%90%E6%B3%A2%E9%82%A3%E5%A5%91%E6%95%B0%E5%88%97.py

''' 题目一:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。 n<=39

题目二:一只青蛙一次可以跳上一级台阶,也可以跳上两级台阶,问该青蛙跳上一个 n 级台阶有多少种跳法?

题目三:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。 解法参见牛客网讨论:https://www.nowcoder.com/questionTerminal/22243d016f6b47f2a6928b4313c85387 '''

-- coding:utf-8 --

class Solution: def Fibonacci(self, n): tempArray = [0, 1] if n >= 2: for i in range(2, n+1): tempArray[i%2] = tempArray[0] + tempArray[1] return tempArray[n%2] # 青蛙跳台阶, 每次可以跳1级或2级 def jumpFloor(self, number): # write code here tempArray = [1, 2] if number >= 3: for i in range(3, number + 1): tempArray[(i + 1) % 2] = tempArray[0] + tempArray[1] return tempArray[(number + 1) % 2]

def jumpFloorII(self, number):
    ans = 1
    if number >= 2:
        for i in range(number-1):
            ans = ans * 2
    return ans

test = Solution() print(test.Fibonacci(100)) print(test.jumpFloor(3)) print(test.jumpFloorII(2))