【剑指Offer】变态(青蛙)跳台阶代码实现

1.牛客网链接:我是链接
2.题目描述:
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
输入:青蛙所跳台阶数n
输出:青蛙跳n级台阶所能采用的方法总数
3.题目分析:
看到这道题的标签是”贪心”,但我并没有使用贪心算法去求解,而还是与“青蛙跳台阶”时一样采取DFS的策略:
使用一个stack number_index数据结构来保存当前青蛙跳到的阶数,在判断number_index
不为空进行的while循环里取出其栈顶元素(stack::top方法)保存到int temp中,并在循环
内判断其分别+1,+2,…+n时是否与n相等,相等则将总方法数sum++,不相等且小于
n时将其压入number_index作为青蛙下一个跳到的阶数;直到number_index为空结束循环,
函数返回方法总数。
与“青蛙跳台阶”不同的是,题中的这只青蛙可以一次蹦的台阶数目最高可到总台阶数目n,不
愧是你,变态青蛙;而神奇的一件事情是,我在仅仅改变了一两行的DFS版“青蛙跳台阶”
而实现的DFS版“变态青蛙跳台阶”在牛客网的编译器上提交运行之后,竟然通过了,并没有出
现前者的运行超时的问题。
4.代码实现:

class Solution {
public:
    int jumpFloorII(int number) {
        if(number==0)return 0;
        if(number==1)return 1;
        if(number==2)return 2;
        stack<int> number_index;//保存当前青蛙可能跳到的阶数
        number_index.push(0);//从0阶台阶开始跳
        int temp=0;//当前阶数
        int ans=0;//下一阶数
        int sum=0;//方法数
        while(!number_index.empty())
        {
            temp=number_index.top();
            number_index.pop();
            for(int i=1;i<=number;i++)//青蛙在一步中所有能跳到的阶数:0-number
            {
                ans=temp+i;
                if(ans==number)sum++;//如果青蛙下一步跳到第number阶则方法总数+1
                else if(ans<number)number_index.push(ans);
            }
        }
        return sum;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值