爬楼梯算法的数学思路

爬楼梯算法的数学思路

今日腾讯实习面试,问到一题算法。
爬楼梯问题:一个楼梯一共n个台阶,一次上1或者2个台阶。问,一共多少种解法。
这个问题,当时学递归的时候,我记得做过。但是已经一年半没写过递归和动态规划。所以,第一反应是用数学思路解决。

数学的想法是这样的:
n已知
我们创建一个列表存放执行的步骤:
比如,有三个台阶。
**[1,1,1]**代表,我们每次走一个台阶,完成这个任务。
**[1,2]**代表,先走1个台阶,再走2个台阶。完成任务。
**[2,1]**代表,先走2个台阶,再走1个台阶。完成任务。

当已知的台阶数为n, 自然就有下面的想法。

  1. [ n个1 ] 意为走了n个1完成任务
  2. [ n-1 个 1; 1 个 2 ] 意为走了n-1个1, 走了一个2完成任务。
  3. [ n-2 个 1; 2 个 2 ] 意为走了n-2个1, 走了两个2完成任务。

一个重要的点是:
当我们采用走了n-1个1,和一个2时,它的方法总数其实应该是:在这里插入图片描述
意为: 将1个2放到n-1个1中。
所以最后的结果应该为:

所有的和为:
sum = 1 + Cnk(n-1, 1) + Cnk(n-2, 2) + … Cnk(n/2 , n/2) 偶数情况。
sum = 1 + Cnk(n-1, 1) + Cnk(n-2, 2) + … Cnk(n//2 + 1 , n//2 - 1) 奇数情况。

注: n//2 为: 用n整除2, 然后取得的数向下取整。 (2.1取2, 2.9取2)
代码如下:


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值