变态跳台阶
时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
思路:(重要是分析)
本题前提是n个台阶,会有n阶的跳发,分析如下:
f(1) = 1
f(2) = f(2-1)+ f(2 -2) //f(2-2)代表2阶台阶一次跳2阶的次数
f(3) = f(3 -1) + f(3 -2) + f(3-3)
......
f(n) = f(n-1) + f(n-2) + f(n - 3)+ .....+ f(n - (n-1)) + f(n-n)
说明:
1、这里的f(n)代表的是n个台阶有一次1,2,。。。。,n阶的跳法数
2、n = 1时,只有一种跳发,f(1) = 1
3、n = 2时,有两种跳发,一种1阶1阶跳,或者是直接跳2阶,f(2) = f(2 -1) + f(2 - 2)
4、 n = 3时,会有三种跳发:1阶、2阶、3阶
那么第一次跳出一阶后面剩下:f(3 - 1);第一次跳出2阶,剩下f(3 -2);第一次3阶,剩下f(3 -3)
有结论:f(3) = f(3 -1) + f(3 -2) + f(3 - 3)
5、n = n时,会有n种跳的方式,1,2,3,4,5,。。。。,n阶
结论:f(n) = f(n - 1) + f(n - 2) + .....+ f(n - (n - 1) ) + f(n - n)
6、由以上可得到另一种结论:
f(n - 1) = f(0) + f(1) + f(2) + .....+ f((n -1) -1) = f(0) + f(1) +f(2) + ...... +f(n - 2)
f(n ) = f(0) + f(2) + f(3) + ......+f(n - 2) + f(n - 1) = f(n - 1) + f(n - 1)
==>f(n) = 2 * f(n - 1)
7、因此由此结论:
n <= 0:
f(n) = 0;
n == 1:
f(n) = 1;
n >= 2:
f(n) = 2 * f(n - 1)
代码实现:
递归:
class Solution { public: int jumpFloorII(int number) { if(number <= 0) return 0; if(number == 1) return 1; return 2 * jumpFloorII(number -1); } };
动态规划:
class Solution { public: int jumpFloorII(int number) { if(number <= 0) return -1; if(number == 1) return 1; int sum = 1; for(int i = 2;i <= number;i++) { sum = 2 * sum; } return sum; } };
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】博客园携手 AI 驱动开发工具商 Chat2DB 推出联合终身会员
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET 依赖注入中的 Captive Dependency
· .NET Core 对象分配(Alloc)底层原理浅谈
· 聊一聊 C#异步 任务延续的三种底层玩法
· 敏捷开发:如何高效开每日站会
· 为什么 .NET8线程池 容易引发线程饥饿
· 一个适用于 .NET 的开源整洁架构项目模板
· 【开源】C#上位机必备高效数据转换助手
· .NET 9.0 使用 Vulkan API 编写跨平台图形应用
· MyBatis中的 10 个宝藏技巧!
· [.NET] 使用客户端缓存提高API性能