JZ9-变态跳台阶
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。示例输入3返回值4源代码思路:我们根据正常跳台阶的做法,可以推断出:如果上一步跳1步到达第n个台阶的,那么就是f[n-1]的方法数如果上一步是跳2步到达第n个台阶的,那么就是f[n-2]的方法数…如果上一步是跳n步到达第n个台阶的,那么就是f[0]的方法数这道题还有一个踩坑点就是他
·
题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
示例
输入
3
返回值
4
源代码
思路:
我们根据正常跳台阶的做法,可以推断出:
如果上一步跳1步到达第n个台阶的,那么就是f[n-1]的方法数
如果上一步是跳2步到达第n个台阶的,那么就是f[n-2]的方法数
…
如果上一步是跳n步到达第n个台阶的,那么就是f[0]的方法数
这道题还有一个踩坑点就是他可以直接跳n阶,所以有一个第0阶,而且f[0]=1.
我们因此可以很容易的得到递推式为:
f[n]=f[n-1]+f[n-2]+…+f[2]+f[1]+f[0]
class Solution {
public:
int jumpFloorII(int n) {
if (n==0 || n==1) return 1;
vector<int> f(n+1, 0);
f[0] = f[1] = 1;
for (int i=2; i<=n; ++i) {
for (int j=0; j<i; ++j) {
f[i] += f[j];
}
}
return f[n];
}
};
在这里,我们根据上面的递推式,
f[n-1]=f[n-2]+…+f[2]+f[1]+f[0],
所以f[n]=2*f[n-1]
继续优化后的代码为:
int jumpFloorII(int n) {
if (n==0 || n==1) return 1;
int a = 1, b;
for (int i=2; i<=n; ++i) {
b = a * 2;
a = b;
}
return b;
}
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
已为社区贡献4条内容
所有评论(0)