题目说明
# 假设你正在爬楼梯。需要 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
官方地址
解题思路
- 动态扩展
- 递归
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)
}