carloscn / structstudy

Leetcode daily trainning by using C/C++/RUST programming.
4 stars 1 forks source link

leetcode509:斐波那契数(fibonacci-number) #147

Open carloscn opened 1 year ago

carloscn commented 1 year ago

问题描述

斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:

F(0) = 0,F(1) = 1 F(n) = F(n - 1) + F(n - 2),其中 n > 1 给定 n ,请计算 F(n) 。

示例 1:

输入:n = 2 输出:1 解释:F(2) = F(1) + F(0) = 1 + 0 = 1 示例 2:

输入:n = 3 输出:2 解释:F(3) = F(2) + F(1) = 1 + 1 = 2 示例 3:

输入:n = 4 输出:3 解释:F(4) = F(3) + F(2) = 2 + 1 = 3   提示:

0 <= n <= 30

来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/fibonacci-number

carloscn commented 1 year ago

问题分析

已经做了https://github.com/carloscn/structstudy/issues/16 关于这个的,这次按照Carl的专题动态规划重新做。 参考: https://github.com/youngyangyang04/leetcode-master/blob/master/problems/0509.%E6%96%90%E6%B3%A2%E9%82%A3%E5%A5%91%E6%95%B0.md

动态规划公式:

确定dp数组及dp数组的下标含义

dp[i] ,i 就是数列第i项的值

确定dp公式

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

dp数组初始化

最小的项是2,所以至少要确定 i = 2 之前的数字,dp[0] = 0, dp[1] = 1, 接着dp[2]就可以由公式得到,dp[2] = dp[1] - dp[0]

确定遍历顺序

大的数字需要由小的数字计算出,因此从0 开始计算