剑指offer-跳台阶问题

1. 跳台阶

题目描述

一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。

如果第一次跳一个台阶,那么剩下n-1个台阶,再进行f(n-1)次

如果跳两个台阶,那么剩下n-2个台阶,再进行f(n-2)次

这就类似于 Fibonacci,可以用递归和循环来解决这个问题。

方法一:递归

class Solution {
public:
    int jumpFloor(int number) {
        int count=0;
		if(number<=0)
        	return 0;
        else if(number==1)
        	count=1;
        else if(number==2)
        	count=2;
        else
        	count=jumpFloor(number-1)+jumpFloor(number-2);
        return count;
    }
};

方法二:循环

class Solution {
public:
    int jumpFloor(int number) {
        if(number<=0)
			return 0;
		int n1=0,n2=1,n=0;
		for(int i=1;i<=number;i++)
		{
			n=n1+n2;
			n1=n2;
			n2=n;
		}
		return n;
    }
};

循环要比递归更快,所以是推荐用循环,也就是下面那个方法。

 

2.变态跳台阶

题目描述

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

这个题目可以先列出几种情况

只有一个台阶的时候,只有一种方法。f(1)=1    

有两个台阶的时候,有两种方法。f(2)=2           =f(1)+f(0)   (假设f(0)=1)

有三个台阶的时候,有4种方法,(先跳一个台阶,先跳两个台阶,和先跳三个台阶)。 f(3)=4     =f(2)+f(1)+f(0)

有n个台阶的时候,那么f(n)=f(n-1)+f(n-2)+f(n-3)+...+f(0)

而同时,f(n-1)=f(n-2)+f(n-3)+...+f(0)

因此f(n)也可以化简为f(n)=2*f(n-1)

由此又可以有递归和循环两种方法,依然推荐用循环的方法:

class Solution {
public:
    int jumpFloorII(int number) {
        int n0=1,n1=1;
		for(int i=2;i<=number;i++)
		{
			n1=2*n0;
			n0=n1;
		}
		return n1;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值