欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 金融 > LeetCode|70.爬楼梯

LeetCode|70.爬楼梯

2024/10/25 21:26:35 来源:https://blog.csdn.net/weixin_44043952/article/details/142860799  浏览:    关键词:LeetCode|70.爬楼梯

在这里插入图片描述

  • 这道题很像斐波那契数列,但是初始值不同,也有动态规划的解法,但是一开始我想到的是递归写法。
  • 现在我们站在第n阶台阶,那么,我们上一步就有两种可能:1、我们从第n-1阶台阶走一步上来的;2、我们从第n-2阶台阶直接走两步上来的。
  • 那么我们走到第n阶台阶的方法数量就等于我们走到第n-1阶台阶的方法数量加上第n-2阶台阶的方法数量之和。
class Solution(object):def climbStairs(self, n):""":type n: int:rtype: int"""if n == 0:return 1if n == 1:return 1if n == 2:return 2return self.climbStairs(n-1) + self.climbStairs(n-2)
  • 这就是我最初写出来的代码,其实很接近了,但是这样直接超时了,因为会有很多重复计算!
  • 这种情况可以把计算好的结果给存下来,这样就不用重复计算了,也是空间换时间的一种方式。
class Solution(object):def climbStairs(self, n):""":type n: int:rtype: int"""# 定义一个字典用于存储已经计算过的结果memo = {}# 定义递归函数def helper(n):# 如果 n 已经在 memo 中,直接返回if n in memo:return memo[n]# 基本情况if n == 0:return 1if n == 1:return 1if n == 2:return 2# 递归调用并存储结果nums1 = helper(n - 1)nums2 = helper(n - 2)memo[n] = nums1 + nums2  # 存储结果return memo[n]return helper(n)

在这里插入图片描述

  • 官方题解 - 动态规划+滚动数组
class Solution {
public:int climbStairs(int n) {int p = 0, q = 0, r = 1;for (int i = 1; i <= n; ++i) {p = q; q = r; r = p + q;}return r;}
};
  • 官方题解 - 矩阵快速幂【很高效,遇到过好几次了】

在这里插入图片描述
在这里插入图片描述

type matrix [2][2]intfunc mul(a, b matrix) (c matrix) {for i := 0; i < 2; i++ {for j := 0; j < 2; j++ {c[i][j] = a[i][0]*b[0][j] + a[i][1]*b[1][j]}}return c
}func pow(a matrix, n int) matrix {res := matrix{{1, 0}, {0, 1}}for ; n > 0; n >>= 1 {if n&1 == 1 {res = mul(res, a)}a = mul(a, a)}return res
}func climbStairs(n int) int {res := pow(matrix{{1, 1}, {1, 0}}, n)return res[0][0]
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com