递推法加分数和c语言,跳台阶
0
public class Solution {
public static int sum = 0;
public int jumpFloor(int target) {
jump(0,target);
return sum;
}
public static void jump(int over,int target){
if(over==target){
sum++;
}else {
if(over
jump(over+1,target);
jump(over+2,target);
}
}
}
}
为什么本地可以运行正确,但是牛客网运行错误
发表于 2019-05-29 22:25:09
回复(0)
更多回答
490
推荐
对于本题,前提只有 一次
查看全部
编辑于 2015-06-17 21:21:45
回复(66)
338
比较倾向于找规律的解法,f(1) = 1, f(2) = 2, f(3) = 3, f(4) = 5, 可以总结出f(n) =
f(n-1) +
f(n-2)的规律,但是为什么会出现这样的规律呢?假设现在6个台阶,我们可以从第5跳一步到6,这样的话有多少种方案跳到5就有多少种方案跳到6,另外我们也可以从4跳两步跳到6,跳到4有多少种方案的话,就有多少种方案跳到6,其他的不能从3跳到6什么的啦,所以最后就是f(6)
= f(5) + f(4);这样子也很好理解变态跳台阶的问题了。
class Solution {
public:
int jumpFloor(int number) {
if (number <= 0) {
return 0;
}
if (number == 1) {
return 1;
}
if (number == 2) {
return 2;
}
int first = 1, second = 2, third = 0;
for (int i = 3; i <= number; i++) {
third = first + second;
first = second;
second = third;
}
return third;
}
};
编辑于 2016-10-25 14:12:25
回复(60)
58
对于第n个台阶来说,只能从n-1或者n-2的台阶跳上来,所以
F(n) = F(n-1) + F(n-2)
斐波拉契数序列,初始条件
n=1:只能一种方法
n=2:两种
递归一下就好了
class Solution {
public:
int jumpFloor(int number) {
if(number <= 0)
return 0;
else if(number == 1)
return 1;
else if(number == 2)
return 2;
else
return jumpFloor(number-1) + jumpFloor(number-2);
}
};
发表于 2015-09-05 01:20:50
回复(21)
46
Fibonacci数列,python solution: # -*- coding:utf-8 -*-
class Solution:
def jumpFloor(self, n):
# write code here
res = [1, 1, 2]
while len(res) <= n:
res.append(res[-1] + res[-2])
return res[n]
编辑于 2019-09-08 21:18:36
回复(14)
65
这道题如果用递归的话提交会显示:
运行超时:您的程序未能在规定时间内运行结束,请检查是否循环有错或算法复杂度过大。
于是考虑用迭代解决:
public int jumpFloor(int target) {
if(target == 1 || target == 2) {
return target;
}
//第一阶和第二阶考虑过了,初始当前台阶为第三阶,向后迭代
//思路:当前台阶的跳法总数=当前台阶后退一阶的台阶的跳法总数+当前台阶后退二阶的台阶的跳法总数
int jumpSum = 0;//当前台阶的跳法总数
int jumpSumBackStep1 = 2;//当前台阶后退一阶的台阶的跳法总数(初始值当前台阶是第3阶)
int jumpSumBackStep2 = 1;//当前台阶后退二阶的台阶的跳法总数(初始值当前台阶是第3阶)
for(int i = 3; i <= target; i++) {
jumpSum= jumpSumBackStep1 + jumpSumBackStep2;
jumpSumBackStep2 = jumpSumBackStep1;//后退一阶在下一次迭代变为后退两阶
jumpSumBackStep1 = jumpSum;//当前台阶在下一次迭代变为后退一阶
}
return jumpSum;
}
注:思路引自答主 中大_打酱油,只是完善一下方便快速理解
发表于 2016-04-13 12:56:15
回复(17)
16
可以用动态规划来求解该题
跳到第n个台阶,只有两种可能
从第n-1个台阶跳1个台阶
从第n-2个台阶跳2个台阶
只需求出跳到第n-1个台阶和第n-2个台阶的可能跳法即可
F(n):n个台阶的跳法
递推公式:F(n)=F(n-1)+F(n-2)
不难发现这是一个斐波那契数列
起始条件为F(0)=1,F(1)=1
解法一:自底向上,使用迭代
public class Solution {
public int jumpFloor(int target) {
if(target==0)
return 1;
if(target==1)
return 1;
int si_1=1;
int si_2=1;
int result=0;
for(int i=2;i<=target;i++){
result=si_1+si_2;
si_2=si_1;
si_1=result;
}
return result;
}
}
解法二:自顶向下,使用递归
public class Solution {
public int jumpFloor(int target) {
if(target==1)
return 1;
else if(target==2)
return 2;
return jumpFloor(target-1)+jumpFloor(target-2);
}
}
发表于 2017-01-12 20:22:04
回复(3)
29
1.假设当有n个台阶时假设有f(n)种走法。
2.青蛙最后一步要么跨1个台阶要么跨2个台阶。
3.当最后一步跨1个台阶时即之前有n-1个台阶,根据1的假设即n-1个台阶有f(n-1)种走法。
4.
当最后一步跨2个台阶时即之前有n-2个台阶,根据1的假设即n-2个台阶有f(n-2
)种走法。
5.显然n个台阶的走法等于前两种情况的走法之和即f(n)=f(n-1)+f(n-2)。
6.找出递推公式后要找公式出口,即当n为1、2时的情况,显然n=1时f(1)等于1,f(2)等于2
7. |
1, (n=1)
f(n) = |2, (n=2)
| f(n-1)+f(n-2)
,(n>2,n为整数)
编辑于 2016-05-12 19:27:11
回复(12)
21
问题描述:青蛙可跳1-2级台阶,现在需要跳n个台阶,共有多少中跳法
问题解析:设共跳x个1级台阶,y个2级台阶,可推出x+2y=n =>
x=n-2y,最终问题为对n-2y个一级台阶与y个2级台阶排列组合,即C(n-y,y)。y的范围:y>=0&&y<=(n/2)
x的范围:x>=0&&x<=0。
代码:
//step.c
#include
//从m中取n个进行排列组合
int com(int m,int n)
{
int i = m;
int j;
int sum=1;
for(j = 0;j < n;j++,i--){
sum = sum *i / (j+1);
}
return sum;
}
int step(int n)
{
int two; /*跳两级台阶的次数*/
int count = 0;
for(two = 0;two<= (n/2);two ++){
count += com(n-two,two);
}
return count;
}
void main(void)
{
int n,ret;
printf("please input the value of n:\n");
scanf("%d",&n);
ret = step(n);
printf("The way of dance steps are %d\n",ret);
}
编辑于 2015-05-15 17:35:34
回复(12)
15
总之就是用迭代不用递归就好
class Solution {
public:
int jumpFloor(int number) {
if(number==1||number==2)
{return number;}
int jumpFib=0;
int NumberMinusOne=2;
int NumberMinusTwo=1;
for(int i=3;i<=number;i++){
jumpFib = NumberMinusOne+NumberMinusTwo;
NumberMinusTwo = NumberMinusOne;
NumberMinusOne = jumpFib;
}
return jumpFib;
}
};
发表于 2016-03-18 00:54:55
回复(5)
7
/*
这一题就是延续上一题的斐波那契数列的思路,青蛙跳1级台阶有1种跳法,2级台阶有2种跳法
3级台阶时可以从1级台阶跳上来也可以从2级台阶跳上来,即等于1级台阶的跳法加2级台阶的跳法
因此n级台阶共有n-2级台阶跳法数+n-1级台阶跳法数;这不就变成了上一道题目么,只是初始数字变了
n=1,sum=1,n=2,sum=2,n=3,sum=3;
*/
public class Solution {
public int jumpFloor(int target) {
if(target<=0){
return 0;
}
int fn1=1,fn2=2,sum=0;
if(target<=2){
if(target==1){
return fn1;
}else{
return fn2;
}
}
while(target>2){
sum =fn1+fn2;
fn1=fn2;
fn2=sum;
target--;
}
return sum;
}
}
运行时间:35ms
占用内存:654k
发表于 2017-06-07 14:19:50
回复(1)
6
class Solution {
public:
int jumpFloor(int number) {
int t1=1,t2=2,total=0;
if (number==1||number==2) return number;
for(int i=3;i<=number;i++) {
total=t1+t2;
t1=t2;
t2=total;
}
return total;
}
};
发表于 2016-08-01 18:34:24
回复(4)
6
令f(n)表示从任意位置向上跳n个台阶的跳法个数,当从第一个台阶向上跳时,可以先跳一个,也可以先跳两个:跳一个时,则后续跳法为f(n-1)个;跳两个时,后续跳法为f(n-2),
故f(n)=f(n-1)+f(n-2)
可以进行扩展,若一次可以跳1至n个台阶,则f(n)=f(n-1)+f(n-2)+...f(1)
推导可得:f(n-1)=f(n-2)+(n-3)+...f(1) 即f(n)=2*f(n-1)
发表于 2015-07-06 21:07:43
回复(5)
4
//递归方法
int jumpFloor(int number)
{
if(number<=2)
return number;
else
return jumpFloor(number-1)+jumpFloor(number-2);
}
//斐波那契方法
int jumpFloor(int number)
{
int f1=1,f2=2;
while(number>2)
{
f1=f1+f2;
f2=f1+f2;
number-=2;
}
return number==1?f1:f2;
}
//排列组合方法
int jumpFloor(int number)
{
int kinds=0;
//all 1 step
++kinds;
//2 steps for 1:number/2
int steps2=1;
long long temp=1;
while(2*steps2 <= number)
{
int bits= number-steps2;
temp*=steps2;
long long sum=1;
for(int i=0;i
sum*= (bits-i);
kinds+=sum/temp;
++steps2;
}
return kinds;
}
}; 欢迎指正
编辑于 2018-04-16 17:37:19
回复(0)
4
/**
*1.假设当有n个台阶时假设有f(n)种走法。
*2.青蛙最后一步要么跨1个台阶要么跨2个台阶。
*3.当最后一步跨1个台阶时即之前有n-1个台阶,根据1的假设即n-1个台阶有f(n-1)种走法。
*4. 当最后一步跨2个台阶时即之前有n-2个台阶,根据1的假设即n-2个台阶有f(n-2 )种走法。
*5.显然n个台阶的走法等于前两种情况的走法之和即f(n)=f(n-1)+f(n-2)。
*6.找出递推公式后要找公式出口,即当n为1、2时的情况,显然n=1时f(1)等于1,f(2)等于2
*7. 1, (n=1)
*f(n) = 2, (n=2)
* f(n-1)+f(n-2) ,(n>2,n为整数)
*/
public class Solution {
public int jumpFloor(int target) {
int fn1 = 1;
int fn2 = 2;
if(target <= 0) {
return 0;
}
if(target == 1) {
return fn1;
}
if(target == 2) {
return fn2;
}
while(target>2) {
fn2 += fn1;
fn1 = fn2-fn1;
target--;
}
return fn2;
}
}
发表于 2016-08-10 17:35:55
回复(0)
6
编辑于 2016-03-12 10:39:01
回复(1)
3
public class Solution {
public int jumpFloor(int target) {
if(target==1)
return 1;
if(target==2)
return 2;
return jumpFloor(target-1)+jumpFloor(target-2);
}
}
对于N级台阶,可以从N-1级和N-2级上来,所以jumpFloor(N) =
jumpFloor(N-1)+
jumpFloor(N-2)
N=1时,只有一种
N=2时,有两种:一次2级;两次1级
发表于 2016-11-23 11:47:38
回复(1)
3
能用非递归方法的可以尽量不用递归的方法,这样可以减少时间复杂度
发表于 2016-04-22 16:17:42
回复(1)
3
public class Solution {
public int jumpFloor(int target) {
int result = 0;
if(target > 0){
if(target<=2)
return target;
else
return result=jumpFloor(target-1)+jumpFloor(target-2);
}
return result;
}
}
编辑于 2015-05-13 15:05:43
回复(4)
2
public class Solution {
public int jumpFloor(int target) {
if(target == 1)
return 1;
if(target == 2)
return 2;
int fibOne = 1;
int fibTwo = 2;
int fibN = 0;
for(int i = 2; i < target ; i++){
fibN = fibOne + fibTwo;
fibOne = fibTwo;
fibTwo = fibN;
}
return fibN;
/*
if(target == 1)
return 1;
if(target == 2)
return 2;
return jumpFloor(target-1)+jumpFloor(target - 2);
*/
}
}
有两种解题方法:
一种是常规递归解法,时间复杂度太过于昂贵,如注释里面就是常规方法;
所以我们用的非递归方法,也就是方法二
具体思路请看斐波拉切数列的思路。
编辑于 2018-05-17 17:55:52
回复(0)
2
很典型的采用分治法的思想来解决的问题
首先当问题规模很小时,即number=1和2时,分别对应1和2种跳台阶的方法;
当number>2时要考虑第一个台阶,如果跳1则还要考虑number-1的跳法有多少种,如果跳2则还要考虑number-2的跳法有多少种;
得到公式
程序设计时第一步先解决小规模问题,如问题规模较大,则将问题分解为小规模问题,再将小规模问题解合并,采用递归的方法,可能复杂度会比较高,因为各个子问题并不是独立的。 class Solution {
public:
int jumpFloor(int number) {
int n;
if(number==0)
return -1;
if(number==1)
return 1;
if(number==2)
return 2;
if(number>2)
n=jumpFloor(number-1)+jumpFloor(number-2);
return n;
}
};
发表于 2018-04-07 21:21:42
回复(0)
2
实际上本题最终结果就是一个斐波那契数列,这个前面很多都提到了,我就不再说。
主要分享一下自己的解题思路,开始步骤就是暴力穷举想找规律,以为是N!,但是很快证明不是,于是在纸上画图
很明显是一个二叉树,虽然不平衡,我在画完左半边之后发现,左边的4的子树其实是5的一个子集,5的为0的链接应该是4+3,这是一个典型的斐波那契情况。。一下就破题了,不过那个变态跳台阶的目前还没有想出来。。
发表于 2017-12-06 17:22:50
回复(0)
递推法加分数和c语言,跳台阶相关推荐
- python跳台阶_递推典型算法:猴子爬山,跳台阶,爬楼梯(牛客网)、魔法深渊(快手)----Python、Java...
递推算法的基本思想是把一个复杂的.庞大的计算过程转化为简单过程的多次重复,其首要问题是得到相邻的数据项之间的关系,即递推关系.以猴子爬山为例. 1.问题的提出 一个顽猴在一座有30级太假的小山上爬山活 ...
- 递推法 c语言,递推法
递推算法 给定一个数的序列H0,H1,-,Hn,-若存在整数n0,使当n>n0时,可以用等号(或大于号.小于号)将Hn与其前面的某些项Hi(0 递推算法是一种简单的算法,即通过已知条件,利用特定 ...
- 银行存款(C语言,递推法)
题目: 母亲为儿子sun 4年的大学生活准备了一笔存款,方式是整取零存,规定sun 每个月月底取下一个月的生活费.假设银行年利息为1.71%,计算该母亲每个月至少要存入多少钱? 算法分析: 可采用逆推 ...
- 随机数字信号处理实验报告三——Levinson和Burg递推法MATLAB实现
完整的实验报告下载连接https://download.csdn.net/download/LIsaWinLee/14884452 一.实验原理 随机信号的功率谱密度用来描述信号的能量特征随频率的变化 ...
- 常见算法思想2:递推法
递推法 递推算法犹如稳重的有经验的老将,使用"稳扎稳打"的策略,不断利用已有的信息推导出新的东西. 在日常应用中有如下两种递推算法: (1)顺推法:从已知条件出发,逐步推算出要解决 ...
- 【递推法】错排问题的递推式和推导过程
[递推法]错排问题的递推式和推导过程 前言:这篇博客是帮助没有见过错排的新人更好的理解错排问题的递推式和推导过程,各位大佬可自行跳过 题目链接:洛谷P1595信封 一.错排问题的定义: 很多人 ...
- 递推法与递归法2022.3.14
递推法与递归法2022.3.14 递推法是用于数值求解的一个重要算法. 存储型的递归和递推: 存储就加个数组就好了吧. 三角形递推,先赋好值然后从后往前递推.甚至都不需要额外的空间,最后返回a[1][ ...
- 记忆化搜素,和递推法
记忆化搜素是动态规划的改进,------自上而下,就是在递归重叠子问题时候,对子问题的重复问题的对策,就是一开始对所有子问题进行赋值(一般为-1)这样的标记方法来区分是否被查找过. 递推----也是动 ...
- 随机信号处理AR模型Yule_Walker方程直接解法和Levinson_Durbin递推法的MATLAB与Python实现
AR模型 AR模型的系统函数H(z)可以表示为: 我们的目的就是要求解系统函数的参数a和增益G. Yule_Walker方程 矩阵形式 根据生成的矩阵,可以解出p个参数 ,再根据自相关函数,可以求出系 ...
最新文章
- python选择排序从大到小_经典排序算法和Python详解之(一)选择排序和二元选择排序...
- 关于 android listview 加载数据错位(错乱)问题
- Appium——api常用函数
- ai人工智能_人工智能能力问答中的人工智能不确定性
- nginx 参数、变量和例子
- 导出指定字符集dmp文件_Oracle 11G数据库导入导出终极解决方案
- python log函数_python装饰器的使用
- 图书馆占座系统(四)
- Ubuntu下使用date显示毫秒级
- 阮一峰ES6学习笔记(1)
- 形式语言与自动机理论 pdf_448页伊利诺伊大学算法图书【附PDF资料】
- 无人驾驶汽车系统入门(十五)——ROS入门与实践(2)
- Android图片的裁剪
- 持续更新就是给软件上医保
- win10亮度无法调节问题
- CSAPP 3e Attack lab
- 指尖江湖李忘生鸿蒙初开,指尖江湖掌门天团年轻时外装来袭!其中,纯阳掌教李忘生的该系列外装名为?剑网3指尖江湖11.9答案_游侠手游...
- 企业微信+python实现监控服务器状态和实时查询数据
- 7279 - Sheldon Numbers
- 阅读Hierarchical Graph Representation Learning with Differentiable Pooling(NeurIPS 2018)
热门文章
- 零基础制作抖音超火的GIF表情包,这个工具你肯定用的到!
- 乐高无限都有什么服务器,乐高无限:无限种想象,无限制创造,只有一种实现方法...
- js jquery控制input为只读
- 从Cloudflare事件,看DNS服务的重要性
- 南昌大学怎么样?(一位在校学长的真实感受与强烈推荐)
- 苹果的又一失败产品!HomePod音箱渐显颓势
- vue 获取当前日期的第二天
- Copilot使用的关卡——GitHub教育认证方法和注意事项
- PHP使用file_get_contents请求接口函数报错/出现乱码的解决办法
- ps—Photoshop绘图模式、画笔工具,渐变工具,油漆桶工具等选项栏中的模式/溶解模式,背后模式,清除模式,变暗模式等/CS6