今天是第 天刷leetcode,立个flag,打卡60天,如果做不到,完成一件评论区点赞最高的挑战。
算法挑战链接
509. 斐波那契数https://leetcode.cn/problems/fibonacci-number/
第一想法
这个就是求斐波那契数,感觉应该不用怎么解释。
因为有公式:
F(0) = 0,F(1) = 1 F(n) = F(n - 1) + F(n - 2),其中 n > 1
所以按照公式来写就可以了。代码如下
class Solution {
public int fib(int n) {
if (n == 0) {
return 0;
}
if (n == 1) {
return 1;
}
int n2 = 0;
int n1 = 1;
int result = 0;
for (int i = 0; i < n - 1; i++) {
result = n1 + n2;
n2 = n1;
n1 = result;
}
return result;
}
}
看完代码随想录之后的想法
这是一道很简单的动态规划。
代码随想录总结了动态规则做题的五个过程。
- 确定dp数组以及下标的含义
dp[i]的定义为:第i个数的斐波那契数值是dp[i]
- 确定递推公式
为什么这是一道非常简单的入门题目呢?
因为题目已经把递推公式直接给我们了:状态转移方程 dp[i] = dp[i - 1] + dp[i - 2];
- dp数组如何初始化
题目中把如何初始化也直接给我们了,如下:
dp[0] = 0;
dp[1] = 1;
- 确定遍历顺序
从递归公式dp[i] = dp[i - 1] + dp[i - 2];中可以看出,dp[i]是依赖 dp[i - 1] 和 dp[i - 2],那么遍历的顺序一定是从前到后遍历的
- 举例推导dp数组
按照这个递推公式dp[i] = dp[i - 1] + dp[i - 2],我们来推导一下,当N为10的时候,dp数组应该是如下的数列:
0 1 1 2 3 5 8 13 21 34 55
如果代码写出来,发现结果不对,就把dp数组打印出来看看和我们推导的数列是不是一致的。
今日收获
简单的只是让你知道更多的信息,复杂是隐去了更多的信息