[算法]---斐波那契数列模型

目录

[1. 第N个泰波那契数](#1. 第N个泰波那契数)

[1.1 解题思路](#1.1 解题思路)

[1.2 代码实现](#1.2 代码实现)

[2. 三步问题](#2. 三步问题)

[2.1 解题思路](#2.1 解题思路)

[2.2 代码实现](#2.2 代码实现)

[3. 使用最小花费爬楼梯](#3. 使用最小花费爬楼梯)

[3.1 解题思路](#3.1 解题思路)

[3.2 代码实现](#3.2 代码实现)

[4. 解码方法](#4. 解码方法)

[4.1 解题思路](#4.1 解题思路)

[4.2 代码实现](#4.2 代码实现)


1. 第N个泰波那契数

题目链接

1.1 解题思路

我们可以使用递归来解决这道题,但是递归中有重复的运算,给一个数找到这个数的泰波那锲数,这里我们可以利用动态规划设置一个dp数组来记录这些计算过的数,直接在数组里面找这些重复计算的结果。

1.2 代码实现

使用动态规划解决的代码:

java 复制代码
class Solution {
    public int tribonacci(int n) {
        //1 创建dp表
        //2 初始化dp表
        //3 填表
        //4 返回结果

        //处理边界条件
        if(n == 0) {
            return 0;
        }
        if(n == 1 ||n == 2) {
            return 1;
        }
        int[] dp = new int[n+1];
        dp[0] = 0;
        dp[1] = 1;
        dp[2] = 1;
        for(int i = 3; i <= n; i++) {
            dp[i] = dp[i-1] + dp[i-2] + dp[i-3];
        }
        return dp[n];
    }
}

对代码进行了空间优化:

java 复制代码
class Solution {
    public int tribonacci(int n) {
        //处理边界情况
        if(n == 0) {
            return 0;
        }
        if(n == 1 || n == 2) return 1;

        //空间优化
        int a = 0, b = 1, c = 1, d = 0;
        for(int i = 3; i <= n; i++) {
            d = a + b + c;
            a = b;
            b = c;
            c = d;
        }
        return d;
    }
}

2. 三步问题

题目链接

2.1 解题思路

2.2 代码实现

java 复制代码
class Solution {
    public int waysToStep(int n) {
        int MOD = (int)1e9 + 7;

        //处理边界条件
        if(n == 1) return 1;
        if(n == 2) return 2;
        if(n == 3) return 4;

        int[] dp = new int[n+1];
        dp[1] = 1;
        dp[2] = 2;
        dp[3] = 4;
        for(int i = 4; i <= n; i++) {
            dp[i] = ((dp[i-1] + dp[i-2]) % MOD + dp[i-3]) % MOD;
        }
        return dp[n];
    }
}

3. 使用最小花费爬楼梯

题目链接

3.1 解题思路

3.2 代码实现

思路一:

java 复制代码
class Solution {
    public int minCostClimbingStairs(int[] cost) {
        int len = cost.length;

        int[] dp = new int[len + 1];
        dp[0] = 0;
        dp[1] = 0;
        for(int i = 2; i < len + 1; i++) {
            dp[i] = Math.min(dp[i-1] + cost[i-1],dp[i-2] + cost[i-2]);
        }
        return dp[len];
    }
}

思路二:

java 复制代码
class Solution {
    public int minCostClimbingStairs(int[] cost) {
        int n = cost.length;
        
        int[] dp = new int[n + 1];
        dp[n-1] = cost[n-1];
        dp[n-2] = cost[n-2];

        for(int i = n - 3; i >= 0; i--) {
            dp[i] = Math.min(dp[i+1] + cost[i], dp[i+2] + cost[i]);
        }
        return Math.min(dp[0], dp[1]);
    }
}

4. 解码方法

题目链接

4.1 解题思路

4.2 代码实现

java 复制代码
class Solution {
    public int numDecodings(String s) {
        char[] arr = s.toCharArray();
        int n = arr.length;
        int[] dp = new int[n];

        if(arr[0] != '0') dp[0] = 1;
        if(n == 1) return dp[0];

        if(arr[1] != '0' && arr[0] != '0') dp[1] += 1;
        int tmp = (arr[0] - '0') * 10 + (arr[1] - '0');
        if(tmp >= 10 && tmp <= 26) dp[1] += 1;

        int count = 0;
        for(int i = 2; i < n; i++) {
            if(arr[i] != '0') dp[i] += dp[i-1];

            int sum = (arr[i-1] - '0') * 10 + (arr[i] - '0');
            if(sum >= 10 && sum <= 26) dp[i] += dp[i-2];
        }
        return dp[n-1];
    }
}

我们还可以对上面代码中的初始化代码进行优化,将dp数组大小扩大一位,将初始化原来dp1位置的值,放在循环里面,代码如下:

java 复制代码
class Solution {
    public int numDecodings(String s) {
        char[] arr = s.toCharArray();
        int n = arr.length;
        int[] dp = new int[n + 1];

        dp[0] = 1;
        if(arr[0] != '0') dp[1] = 1;

        for(int i = 2; i <= n; i++) {
            if(arr[i - 1] != '0') dp[i] += dp[i-1];

            int sum = (arr[i - 2] - '0') * 10 + (arr[i - 1] - '0');
            if(sum >= 10 && sum <= 26) dp[i] += dp[i-2];
        }
        return dp[n];
    }
}
相关推荐
企业数字化笔记35 分钟前
视频人体姿态怎么做三维可视化?2D关键点、深度局限与技术选型
人工智能·算法·音视频
?abc!1 小时前
(数组)581. 最短无序连续子数组
数据结构·算法·leetcode
小郎君6584 小时前
MPTT树复选框的半选状态:一棵百万节点树从递归到计数器,再到区间覆盖
算法
酌沧4 小时前
MemT让记忆成为模型内生能力
jvm·人工智能·算法
Shimeri5 小时前
越卷越像:我用遗传算法做了个"内卷"实验
算法·three.js·数据可视化·遗传算法·进化算法
Evand J5 小时前
【PMSM例程1】永磁同步电机(PMSM)转速与转子电角度观测算法|基于扩展卡尔曼滤波(EKF)的传感器状态估计与误差。附下载链接
算法·电机·1024程序员节·卡尔曼滤波
guo_wen_qiang5 小时前
二叉树的层序遍历-使用双端队列Deque
算法·leetcode·1024程序员节
爱读书的小胖5 小时前
LeetCode 55 跳跃游戏 C 语言解题分析
c语言·数据结构·算法·leetcode·1024程序员节
CCblandy5 小时前
前缀缓存命中率不靠引擎靠排列:本机仿真 3 轮,易变字段放开头 98.0%→0.0%
人工智能·python·算法·自然语言处理·性能优化
上班摸鱼下班游戏5 小时前
Unity 仿生智能算法 从蚁群算法 开始
算法·unity·游戏引擎