时间复杂度为O(1)的跳台阶

题目描述:假设有一个n级的台阶,每次可以向上跳一级,两级,三级…N级。问一共有多少中跳法呢?

分析:这是一道典型的动态规划的题目,我们可以这样想,我们最后一步可以跳1级,也可以跳2级,跳三级…跳N级,我们用最后一步跳一级来举例子,假设最后一步跳1级,那还剩下n-1个台阶,又可以分为最后一步跳1级,2级…直到n-1级。 好啦,就分析到这里,我们可以看到当我们最后一步跳一级的时候,剩下的n-1级台阶又是一个同样的范围缩小的子问题,我们当然可以使用递归来做,最好构件一个辅助数组,可以节省大量的运算量。

接下来讲解我的代码:

我以n = 3 时举例:

只有 1 级台阶 : 只有1 种 跳法;

只有 2 级台阶 : 有 2 中跳法;

当有 3 级台阶时: 我们要分为三种情况

                       (1) 最后一步跳一级 , 剩下2级,即再跳个2级的就可以了

                       (2) 最后一步跳两级 , 剩下1级,即再跳个1级的就可以了

                       (3) 最后一步跳三级,  没台阶了,一步到位即 算 1 中方法

算法已经很清楚了

f(1) = 1

f(2) = 2

f(3) = f(2) + f(1) + 1 = 4

f(4) = f(3) + f(2) + f(1) + 1 = 8

其实呢,这是个公比为2,首项为1的等比数列;

所以第n项的值是 f(n) = a1 * q^(n-1)

所以我们可以使用移位来运算,将1向左移位,每移1位,就相当于乘2,刚好数列符合公式。
在这里插入图片描述
作者:时光凉啦啦啦啦啦
https://www.bilibili.com/read/cv2394003
出处: bilibili

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值