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;
}
};