01_斐波那契数列

· 浏览次数 : 0

小编点评

```java class Solution { public int fib(int N) { if (N <= 1) { return N; } int[] dp = new int[N + 1]; dp[0] = 1; dp[1] = 1; for (int i = 2; i <= N; i++) { dp[i] = dp[i - 1] + dp[i - 2]; } return dp[N]; } } ``` **运行结果:** ``` [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55] ``` **与推导数列的结果对比:** ``` [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55] ``` **说明:** * `fib` 方法使用动态规划的递归解题。 * `fib` 方法的压缩版本使用循环和变量交换来实现相同的解题。 * `dp`数组存储了每个数字的斐波那契数值。 * 为了避免重复计算,`dp`数组中保存了以前计算的结果。

正文

509. 斐波那契数

斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是: F(0) = 0,F(1) = 1 F(n) = F(n - 1) + F(n - 2),其中 n > 1 给你n ,请计算 F(n) 。

示例 1:

  • 输入:2
  • 输出:1
  • 解释:F(2) = F(1) + F(0) = 1 + 0 = 1

示例 2:

  • 输入:3
  • 输出:2
  • 解释:F(3) = F(2) + F(1) = 1 + 1 = 2

示例 3:

  • 输入:4
  • 输出:3
  • 解释:F(4) = F(3) + F(2) = 2 + 1 = 3

提示:

  • 0 <= n <= 30

【思路】

练练手为主,就像之前讲过二叉树系列的递归三部曲 (opens new window)回溯法系列的回溯三部曲 (opens new window)一样。后面慢慢大家就会体会到,动规五部曲方法的重要性。

动态规划五部曲

动规五部曲:

这里我们要用一个一维dp数组来保存递归的结果

1、确定dp数组及其下标的含义

dp[i]的定义为:第i个数的斐波那契数值为dp[i]

2、确定递推公式

dp[i]=dp[i-1]+dp[i-2]

3、dp数组如何初始化

dp[0]=1;
dp[1]=1;

4、确定遍历顺序

从递推公式dp[i] = dp[i-1] + dp[i-2];可以看出,dp[i]是依赖于dp[i-1]和dp[i-2]的,那么遍历的顺序一定是从前往后来遍历的

5、举例推到di数组

按照这个递推公式dp[i] = dp[i - 1] + dp[i - 2],我们来推导一下,当N为10的时候,dp数组应该是如下的数列:

0 1 1 2 3 5 8 13 21 34 55

如果代码写出来,发现结果不对,就把dp数组打印出来看看和我们推导的数列是不是一致的。

以上我们用动规的方法分析完了,java代码如下:

//非压缩版本的写法
class Solution {
	public int fib(int N) {
		if (N <= 1) 
			return N;
		int[] dp = new int[N+1];
        dp[0] = 1;
        dp[1] = 1;
		for (int i = 2; i <= N; i++) {
			dp[i] = dp[i-1] + dp[i-2];
		}
		return dp[N];
	}
}
//压缩版本的写法
public int fib(int n) {
    if (n <= 1) {
        return n;
    }
	int a = 0, b = 1, c = 0;
    for (int i = 2; i <= n; i++) {
        c = a + b;
        a = b;
        b = c;
    }
    return c;
}

方法二、传统的递归法

class Solution {
    public int fib(int n) {
        if (n == 0 || n == 1) {
            return n;
        } else {
            return fib(n-1) + fib(n-2);
        }
    }
}

与01_斐波那契数列相似的内容:

01_斐波那契数列

509. 斐波那契数 斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是: F(0) = 0,F(1) = 1 F(n) = F(n - 1) + F(n - 2),其中 n > 1 给你n ,请计算 F(n)

Python性能测试框架:Locust实战教程

01认识Locust Locust是一个比较容易上手的分布式用户负载测试工具。它旨在对网站(或其他系统)进行负载测试,并确定系统可以处理多少个并发用户,Locust 在英文中是 蝗虫 的意思:作者的想法是在测试期间,放一大群 蝗虫 攻击您的网站。当然事先是可以用 Locust 定义每个蝗虫(或测试用

大厂内部的压测方案设计分享!

01为什么要做压测 1、什么是压力测试? 不断向被测对象施加压力,测试系统在压力情况下的表现。 2、压力测试的目的是什么? 测试得出系统的极限性能指标,从而给出合理的承诺值或者容量告警; 找出系统的性能瓶颈,对性能做出优化; 测试系统在高负载情况下的稳定性; 验证系统在过载情况下的限流和降级预案;

01.Alpine编译glibc

概要 本文档采用glibc2.28版本作为示例,模拟内网环境无法访问github等开源社区 为精简docker容器镜像,采用Alpine镜像,需要手动编译glibc源代码 制作编译好的glibc二进制文件 获取glibc二进制文件构建工具 # 内网环境可下载该工具包手动上传到服务器 git pull

背包DP

01 背包 \(01\) 的意图很明显,就是每个物品有 \(01\),即 选 和 不选 两种方式。 暴力 考虑设定一个状态 \(dp[i][j]\) 表示在前 \(i\) 个当中,花费为 \(j\) 所能获得的最大值。 转移可以: \(dp_{i,j}=\max(dp_{i-1,j},dp_{i-1

云原生最佳实践系列 6:MSE 云原生网关使用 JWT 进行认证鉴权

01 方案概述 MSE 网关可以为后端服务提供转发路由能力,在此基础上,一些敏感的后端服务需要特定认证授权的用户才能够访问。MSE 云原生网关致力于提供给云上用户体系化的安全解决方案,其中 JWT 认证能力是在 Json Web Token 这种结构化令牌的基础上实现了一套基于用户体系对用户的 AP

01.前后端分离中台框架后端 Admin.Core 学习-介绍与配置说明

## 中台框架后端项目 Admin.Core 的介绍与配置说明 > 中台admin是前后端分离权限管理系统,Admin.Core为后端项目,基于.NET 7.0开发。 > 支持多租户、数据权限、动态 Api、任务调度、OSS 文件上传、滑块拼图验证、多数据库,分布式缓存、分布式事务等 - 接口文档一

01背包问题

题目 题目描述 有 N N N 件物品和一个容量是 V V V 的背包。每件物品只能使用一次。 第 i i i 件物品的体积是 v i v_i vi​,价值是 w i w_i wi​。 求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。 输出最大价值。 输入格式 第一行两个整

01背包问题的js解决方式

如果你有兴趣看这个相信你已经对背包问题有所了解,所以关于背包问题的描述,我就不写了。只记录一下自己对这个问题的一些看法和思考,于我而言,这个东西现在困扰我的是如何确定最优解。实质上关于背包问题网上的东西我大体都有看过,对于这个问题,常见的就是使背包重量动态增长,然后遍历每个要装入的这些包裹,当包裹的

[转帖]TIKV扩容之刨坑填坑​

01 背景 某tidb集群收到告警,TIKV 节点磁盘使用率85%以上,联系业务无法快速删除数据,于是想到扩容TIKV 节点,原先TIKV 节点机器都是6TB的硬盘,目前只有3TB的机器可扩,也担心region 均衡后会不会打满3TB的盘,PD 调度策略来看应该是会根据不同存储机器的资源配置和使用情