1. 斐波那契数
解法一:递归
class Solution {
public:
int fib(int n) {
return dfs(n);
}
int dfs(int n)
{
if(n == 0 || n == 1)
return n;
return dfs(n - 1) + dfs(n - 2);
}
};
解法二:记忆化搜索
class Solution {
int nums[31]; // 备忘录
public:
int fib(int n) {
memset(nums, -1, sizeof(nums)); // 全部都初始化为-1
return dfs(n);
}
int dfs(int n)
{
// 在备忘录里面查询一下
if(nums[n] != -1)
{
// 如果已经计算过直接返回
return nums[n];
}
// 否则在返回的时候添加到备忘录
if(n == 0 || n == 1)
{
nums[n] = n;
return nums[n];
}
else
{
nums[n] = dfs(n - 1) + dfs(n - 2);
return nums[n];
}
}
};
解法三:动态规划
class Solution {
int dp[31];
public:
int fib(int n) {
dp[0] = 0, dp[1] = 1; // 初始化
for(int i = 2; i <= n; i++)
dp[i] = dp[i - 1] + dp[i - 2]; // 填表
return dp[n]; // 返回值
}
};