【刷题笔记8.13】【动态规划相关】LeetCode题目:斐波那契数列、爬楼梯

【动态规划相关】LeetCode题目:斐波那契数列、爬楼梯

(一)爬楼梯

题目描述

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

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
在这里插入图片描述
提示:
1 <= n <= 45

题目分析(***)

(n个台阶)
1个台阶 :1种方法(一次走一个台阶)
2个台阶 :2种方法(连续两次走一个台阶 或 一次走两个台阶)
3个台阶:3种方法(大家注意昂,此处这三种方法是怎么得到的,并不是说你再像之前那样重新一个一个计算,而是这样,对于3个台阶这种情况,我们可以在上述2个台阶的基础上再走一步,或是在上述1个台阶的基础上再走两步,所以三个台阶这种情况的方法数量是基于上述一个台阶和两个台阶的基础上计算得来,即1 + 2 = 3)
4个台阶:5种方法(在2个台阶的基础上走两步 或 在3个台阶的基础上走一步, 即 2 + 3 = 5)
。。。
n个台阶 :num[n-2] + num[n-1] 种方法

代码实现如下

方法1:

public class Solution {
    public int climbStairs(int n) {
        //如果台阶数n小于2直接返回n即对应的方法数(其实这样做的目的是我们后面设定的数组的大小n+1,
        // 而为了方便数组下标是从1开始的,如果n=1,是会有数组越界异常,因为num[2]中只有数组num[0]和num[1],这样num[2]=2就会有问题)
        if (n < 2) {
            return n;
        }

        //创建数组num,存储台阶数i所对应的方法数num[i]
        int[] num = new int[n+1];

        //台阶数为1有一种方法; 台阶数为2有2种方法
        num[1] = 1;
        num[2] = 2;
        
        //n个台阶 :num[n-2] + num[n-1] 种方法
        for (int i = 3; i <= n; i++) {
            num[i] = num[i-2] + num[i-1];
        }

        //返回n个台阶所对应的方法数
        return num[n];
    }

}

方法2:

public static int climbStairs(int n) {
        if (n < 3) {
            return n;
        }

        int a = 1;
        int b = 2;
        int sum = 0;

        for (int i = 3; i <= n; i++) {
            sum = a + b;
            a = b;
            b = sum;
        }

        return sum;
    }

(二)斐波那契额数列

题目描述

写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下:

F(0) = 0, F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。

答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
在这里插入图片描述

代码实现如下

方法1:

    public static int fib(int n) {
		//作用:大数的排列组合等,一般都要求将输出结果对1000000007取模(取余),防止int溢出。上面提示n的范围是0<= n <= 100
        final int a = 1000000007;

        if (n < 1) {
            return n;
        }

        int[] num = new int[n + 1];

        num[0] = 0;
        num[1] = 1;

        for (int i = 2; i <= n; i++) {
            num[i] = (num[i - 1] + num[i - 2]) % a;
        }

        return num[n];
    }

方法2:

public static int fib(int n) {

        final int x = 1000000007;

        if (n < 2) {
            return n;
        }

        int a = 0;
        int b = 1;
        int sum = 0;

        for (int i = 2; i <= n; i++) {
            sum = (a + b) % x;
            a = b;
            b = sum;
        }

        return sum;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值