leetcode70题-爬楼梯

150 阅读1分钟

题目说明

# 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
# 
#  每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 
# 
#  注意:给定 n 是一个正整数。 
# 
#  示例 1: 
# 
#  输入: 2
# 输出: 2
# 解释: 有两种方法可以爬到楼顶。
# 1.  1 阶 + 1 阶
# 2.  2 阶 
# 
#  示例 2: 
# 
#  输入: 3
# 输出: 3
# 解释: 有三种方法可以爬到楼顶。
# 1.  1 阶 + 1 阶 + 1 阶
# 2.  1 阶 + 2 阶
# 3.  2 阶 + 1 阶
#  
#  Related Topics 动态规划 
#  👍 1198 👎 0

官方地址

leetcode-cn.com/problems/cl…

解题思路

  • 动态扩展
  • 递归

python2解题

#! coding: utf-8
class Solution(object):

    def climbStairs(self, n):
        """
        :type n: int
        :rtype: int
        时间复杂度 o(n)
        """
        # 异常判断
        if n < 0:
            return

        # 如果层高小于2 直接返回对应的层高
        if n <= 2:
            return n

        # 记录所有层高的结果
        result_dict = dict()

        # 第1层 到 n-1层的结果 放入result_dict
        # 利用斐波那契数列的通项公式 f(n) = f(n-1) + f(n-2)
        for i in range(n):
            if i <= 2:
                result_dict[i] = i
            else:
                result_dict[i] = result_dict[i-1] + result_dict[i-2]

        return result_dict[n-1] + result_dict[n-2]


    def fibna(self, n):
        """

        :param n:
        :return:
        """

        if n < 0:
            return

        if n <= 2:
            return n

        return self.fibna(n-1) + self.fibna(n-2)

def main():
    print Solution().climbStairs(100)
    print Solution().fibna(100)

if __name__ == '__main__':
    main()

go 实现

package main

import "fmt"

func fibnaq(n int) int {
	if n < 0 {
		return 0
	}
	if n <= 2 {
		return n
	}
	return fibnaq(n-1) + fibnaq(n-2)
}

func climbStairs(n int) int {
	result_map := make(map [int]int)

	if n <= 0 {
		return 0
	}

	for i:=1; i<n; i++{
		if i <= 2{
			result_map[i] = i
		}else{
			result_map[i] = result_map[i-1] + result_map[i-2]
		}
	}
	return result_map[n-1] + result_map[n-2]
}

func main()  {
	res := fibnaq(10)
	fmt.Println(res)

	res2 := climbStairs(10)
	fmt.Println(res2)
}