LeetCode 70. Climbing Stairs 题解
LeetCode 70. Climbing Stairs 题解题目描述假设你正在爬楼梯。需要n阶你才能到达楼顶。每次你可以爬1或2个台阶。你有多少种不同的方法可以爬到楼顶呢示例 1输入n 2 输出2 解释有两种方法可以爬到楼顶。 1. 1 阶 1 阶 2. 2 阶示例 2输入n 3 输出3 解释有三种方法可以爬到楼顶。 1. 1 阶 1 阶 1 阶 2. 1 阶 2 阶 3. 2 阶 1 阶解题思路方法一动态规划思路定义dp[i]为爬到第i阶的不同方法数状态转移方程dp[i] dp[i-1] dp[i-2]因为爬到第i阶的方法数等于爬到第i-1阶的方法数加上爬到第i-2阶的方法数初始化dp[1] 1dp[2] 2遍历计算dp[3]到dp[n]复杂度分析时间复杂度O(n)其中 n 是台阶数。需要遍历计算dp[3]到dp[n]。空间复杂度O(n)需要一个长度为 n1 的数组来存储状态。方法二动态规划空间优化思路观察到dp[i]只依赖于dp[i-1]和dp[i-2]因此可以使用两个变量来存储前两个状态而不需要使用数组初始化prev 1表示dp[1]curr 2表示dp[2]遍历计算dp[3]到dp[n]每次更新prev和curr的值复杂度分析时间复杂度O(n)其中 n 是台阶数。需要遍历计算dp[3]到dp[n]。空间复杂度O(1)只需要常数级的额外空间。方法三矩阵快速幂思路递推关系dp[i] dp[i-1] dp[i-2]可以表示为矩阵形式[dp[i] ] [1 1] * [dp[i-1]] [dp[i-1]] [1 0] [dp[i-2]]因此我们可以使用矩阵快速幂来加速计算将时间复杂度降低到 O(log n)复杂度分析时间复杂度O(log n)其中 n 是台阶数。矩阵快速幂的时间复杂度是 O(log n)。空间复杂度O(1)只需要常数级的额外空间。代码实现方法一动态规划class Solution: def climbStairs(self, n: int) - int: if n 1: return 1 if n 2: return 2 dp [0] * (n 1) dp[1] 1 dp[2] 2 for i in range(3, n 1): dp[i] dp[i-1] dp[i-2] return dp[n]方法二动态规划空间优化class Solution: def climbStairs(self, n: int) - int: if n 1: return 1 if n 2: return 2 prev 1 # dp[1] curr 2 # dp[2] for i in range(3, n 1): next_val prev curr prev curr curr next_val return curr方法三矩阵快速幂class Solution: def climbStairs(self, n: int) - int: if n 1: return 1 if n 2: return 2 # 定义矩阵乘法 def multiply(a, b): return [ [a[0][0] * b[0][0] a[0][1] * b[1][0], a[0][0] * b[0][1] a[0][1] * b[1][1]], [a[1][0] * b[0][0] a[1][1] * b[1][0], a[1][0] * b[0][1] a[1][1] * b[1][1]] ] # 定义矩阵快速幂 def matrix_pow(matrix, power): result [[1, 0], [0, 1]] # 单位矩阵 while power 0: if power % 2 1: result multiply(result, matrix) matrix multiply(matrix, matrix) power // 2 return result # 初始矩阵 matrix [[1, 1], [1, 0]] # 计算 matrix^(n-2) matrix_n matrix_pow(matrix, n - 2) # 结果为 matrix^(n-2) * [2, 1]^T return matrix_n[0][0] * 2 matrix_n[0][1] * 1测试用例测试用例 1输入n 2输出2测试用例 2输入n 3输出3测试用例 3输入n 4输出5测试用例 4输入n 5输出8总结本题是动态规划的经典问题主要考察对状态定义和状态转移方程的理解。三种方法各有特点动态规划代码简洁易懂逻辑清晰是最直观的解决方案。动态规划空间优化在动态规划的基础上优化了空间复杂度适用于 n 较大的情况。矩阵快速幂将时间复杂度降低到 O(log n)适用于 n 非常大的情况。在实际应用中对于一般的 n动态规划空间优化方法通常是最佳选择因为它既保持了代码的简洁性又具有较高的效率。无论使用哪种方法核心思想都是相同的利用递推关系dp[i] dp[i-1] dp[i-2]来计算爬到第 n 阶的不同方法数。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2464675.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!