《剑指offer》——变态跳台阶

60 篇文章 3 订阅

更多2019年的技术文章,欢迎关注我的微信公众号:码不停蹄的小鼠松(微信号:busy_squirrel),也可扫下方二维码关注获取最新文章哦~

这是《跳台阶》题目的升级版,不止是每步都是1或者2,而是可以从1调到n,求其跳法。

T:

题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

constraints:

时间限制:1秒空间限制:32768K

这一题目,虽然只是略微的修改了条件,但其解题方式完全不同。
同时,“青蛙跳台阶”只是一种具体的场景设定,抽象来看,其可看做如下表述:

抽象:
对于一个正整数 n n n,可以按照如下方式表达:

n = 1 + 1 + ⋯ + 1 ( 共 有 n 个 1 ) n = 1 + 1 + \dots + 1 \qquad(共有n个1) n=1+1++1n1

n = 1 + 2 + 1 + ⋯ + 3 + … n = 1 + 2 + 1 + \dots + 3 + \dots n=1+2+1++3+

即:凡是小于n的正整数可以作为一个加数因子,问总共有多少种此类的表达式?


在我的理解当中,此种类型有2种方式:

隔板法

这里写图片描述

共有n个球,代表n个台阶,在这里设定每个球的数量值为1。n个球有n-1个空隙。

  • 如果插入1个隔板,那就代表只需要2步就可以到达n阶的台阶,类似上图中给出的例子。
  • 在插入1个隔板的情况下,如果插入的位置不同,则代表第一步的步长不同,即第一步跳的台阶数不同,也代表了不同的跳台阶方案,所以,可以应用隔板情况下的组合数进行求解。
  • 比如插入了 k k k个隔板,那么就有 ⟮ k n − 1 ⟯ \lgroup_k^{n-1}\rgroup kn1种跳跃方式。

因此,可以得到如下结果:

⟮ 0 n − 1 ⟯ + ⟮ 1 n − 1 ⟯ + ⋯ + ⟮ n − 1 n − 1 ⟯ = 2 n − 1 \lgroup_0^{n-1}\rgroup + \lgroup_1^{n-1}\rgroup + \dots + \lgroup_{n-1}^{n-1}\rgroup = 2^{n-1} 0n1+1n1++n1n1=2n1

公式推导

f ( n ) f(n) f(n)表示对于 n n n个台阶情况下的所有跳法,
对于第一步来说,青蛙可以跳1阶,2阶,…, n n n阶,那么在以上这么多种的情况下,我们可得到如下的递推公式:

这里写图片描述

因此,本题目的实质,就是求一个次幂。

代码:

	public int JumpFloorII(int target) {
		int count = 1;
		int i = 1;
		while (i < target) {
			count *= 2;
			i ++;
		}
		
		return count;
	}

还有大神有如下解法:

这里写图片描述

可大致描述如下:

这里写图片描述

更多2019年的技术文章,欢迎关注我的微信公众号:码不停蹄的小鼠松(微信号:busy_squirrel),也可扫下方二维码关注获取最新文章哦~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值