【剑指Offer】青蛙跳台阶代码实现

1.牛客网链接:我是链接
2.题目描述:
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有
多少种
跳法(先后次序不同算不同的结果)。
输入:台阶数
输出:跳上n阶台阶所有的方法总数
3.题目分析:
(1)题解使用了斐波那契数列的求解方法:F(n)=F(n-1)+F(n-2)
在一步可以跳上第n级台阶时有两种情况:
a.只差1级台阶,即跳到的台阶数为n-1时,跳到n-1阶的方法有pre1种;
b.只差2级台阶,即跳到的台阶数为n-2时,跳到n-2阶的方法有pre2种。
则此时跳上n阶台阶的方法总数为 F(n)=pre1+pre2
一步跳到n阶之前的n-1,n-2…3阶台阶也可以用同样的方法求得,即递归的思想:
从0阶跳到1阶台阶的方法数为1,从0阶跳到2阶台阶的方法数为2,即可推出从0阶跳到
3阶台阶的方法数为F(3)=pre1+pre2=2+1=3,可推得从0阶跳到之后的台阶数的方法总数。
(2)我认为也可以使用DFS求解:
使用一个stack number_index数据结构来保存当前青蛙跳到的阶数,在判断
number_index不为空进行的while循环里取出其栈顶元素(stack::top方法)保存到
int temp中,并判断其分别+1,+2时是否与n相等,相等则将总方法数sum++,不相等且
小于n时将其压入number_index作为青蛙下一个跳到的阶数;直到number_index为空结
束循环,函数返回方法总数。
但是我写的这种方法的代码在牛客网的编译器上没有运行通过(超时),我拿到vs2015上
使用自带的性能工具测试该方法的函数运行时间是小于2ms的,没有找到问题出现在哪里,
如果阅读到这篇文章的您能够帮我指出问题(代码在下方)那我会非常感激您的。
4.代码实现:
(1)斐波那契数列:

class Solution {
public:
    int jumpFloor(int number) {
        if(number==0)return 0;
        if(number==1)return 1;
        if(number==2)return 2;
        //分解该问题为dp问题:
        //1、如果跳到只差n阶台阶最后一阶有多少种方法pre1:
        //这时只要+1即可到达最后一阶台阶;
        //2、如果跳到只差n阶台阶最后倆阶有多少种方法pre2:
        //这时只要+2即可到达最后一阶台阶;
        //将到达这俩步方法的总数加起来即为到达n阶台阶的全部方法数目
        int pre1=2;
        int pre2=1;
        int i=3;//从当前台阶数为3时开始查找
        int ans=0;//方法总数
        while(i<=number)
        {
            ans=pre1+pre2;
            pre2=pre1;
            pre1=ans;
            i++;
        }
        return ans;
    }
};

(2)DFS方法:

class Solution {
public:
    int jumpFloor(int number,int flag) {
		if (number == 0)return 0;
		if (number == 1)return 1;
		if (number == 2)return 2;
		//分解该问题为dp问题:
		//1、如果跳到只差n阶台阶最后一阶有多少种方法pre1:
		//这时只要+1即可到达最后一阶台阶;
		//2、如果跳到只差n阶台阶最后倆阶有多少种方法pre2:
		//这时只要+2即可到达最后一阶台阶;
		//将到达这俩步方法的总数加起来即为到达n阶台阶的全部方法数目
		int pre1 = 2;
		int pre2 = 1;
		int i = 3;//从当前台阶数为3时开始查找
		int ans = 0;//方法总数
		while (i <= number)
		{
			ans = pre1 + pre2;
			pre2 = pre1;
			pre1 = ans;
			i++;
		}
		return ans;
	}
};

发布了30 篇原创文章 · 获赞 4 · 访问量 2733

猜你喜欢

转载自blog.csdn.net/qq_43167575/article/details/105472636
今日推荐