2024-09-01
算法刷题
00

有n个台阶,青蛙一次只能跳1步到k步,请问有多少种跳法?

这个问题是一个经典的爬楼梯问题,可以使用递推方法解决。

设f[i]表示到达第i层台阶的跳法数,那么到达第i层台阶的跳法数可以由从第i-1,i-2...i-k层台阶跳上来得到,即:

f[i] = f[i-1] + f[i-2] + ... + f[i-k]

当然,这个递推式需要初始化,当i<k时,f[i] = 1,其中,i =1 为起点,f[i]=1.

因此,有n个台阶,青蛙一次只能跳1步到k步的跳法数为f[n]。

代码:

python
def frog_steps(n, k): f = [1] + [0] * n for i in range(1, n+1): for j in range(1, min(i, k)+1): f[i] += f[i-j] return f[n] print(frog_steps(n=4, k=3))

这里的n表示有n个台阶,k表示青蛙一次可以跳的最多步数。代码中的f数组用来存储到达第i层台阶的跳法数。 使用两个循环,外层循环是遍历到达第i层台阶的所有跳法,内层循环是遍历所有从第i-1,i-2...i-k层台阶跳上来的情况,最终将所有跳法数相加。返回第n个台阶的跳法数。

迭代法可以通过滚动数组来优化空间复杂度,下面是一种实现方式:

python
def frog_steps_iteration(n, k): if n < k: return 1 f = [1] + [0] * k for i in range(k+1, n+1): f[i % (k+1)] = sum(f[(i-j) % (k+1)] for j in range(1, k+1)) return f[n % (k+1)] print(frog_steps_iteration(n=4, k=3))

这里与递推类似,不同的是我们使用一个滚动数组f[i % (k+1)], 来存储到达第i层台阶的跳法数。空间复杂度是O(k),这里的n表示有n个台阶,k表示青蛙一次可以跳的最多步数。使用一个循环,遍历所有从第i-1,i-2...i-k层台阶跳上来的情况,最终将所有跳法数相加。返回第n个台阶的跳法数。

如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:Dong

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!