斐波那契数列和爬楼梯问题

力扣70题,爬楼梯

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

注意:给定 n 是一个正整数。

示例 1:

输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
1.  1 阶 + 1 阶
2.  2 阶


示例 2:

输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
1.  1 阶 + 1 阶 + 1 阶
2.  1 阶 + 2 阶
3.  2 阶 + 1 阶

假设楼梯有4阶

1+1+2

1+2+1

2+1+1

2+2+0

在此基础上把2阶拆成1+1阶

即多出来:

1+1+1+1

由此可见,A0=0,A1=1,A2=2,A3=3,A4=5,是个斐波那契数列。

可通过斐波那契数列的通项公式直接求出所需的次数。

第二种是在力扣非常多的一种思路,也就是常用的动态规划,斐波那契数列很容易通过DP来实现。

以下是Java代码:

public class Fib {

    public int fib (int x) {//x是下标
    if (x<=1) return x;
    int []dp = new int[x+1];
    //0 1 1 2 3 5...
    dp[0]=0;
    dp[1]=1;
    for (int a=2;a<=x;a++)
    {
       dp[a]=dp[a-1]+dp[a-2];
        }
    return dp[x];
}

}

递推公式:dp[a]=dp[a-1]+dp[a-2];

初始化条件:0,1

本题可对空间复杂度进行优化,也就是按照斐波那契数列的性质,下一次计算是上上一次+上一次,因此,我们只需要不断地修改上上一次和上一次即可。

根据我们手动计算斐波那契数列的方法,我们会先计算后者,例如1235,我们开始计算下一项的时候,我们首先通过1和2得到3,然后又通过3和2得到5,也就是第一步计算1+2(最前面的两个数值,放到临时变量tmp),第二部计算3+2(temp+2,也就是temp加前面一个)

写成代码如下:

数列的下标123456789
数值112358132134
备注0+1+1

public class Main {
	public static int fb1(int x) {		
		int []dp=new int[2];
		dp[0]=0;
		dp[1]=1;
		for (int a=2;a<=x;a++)
		   {
		    int temp =dp[0]+dp[1];
		    dp[0]=dp[1];
		    dp[1]=temp;//序列的下一个数是前一个总和+这一个
		}
		return dp[1];
	}
	
	public static void main (String []args) {

		System.out.println(fb1(7));
	}


}

关于上面的公式其实也很好解释,

-> 0 = dp[0]

-> 1 = dp[1]

-> TEMP=0+1 (A=2) 

-> Sum=0+1+dp[1] (此时把dp[1]赋值给dp[0])

-> dp[1]=Sum

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值