leetcode_day35

本文最后更新于 2024年7月3日 晚上

今日内容:

509. 斐波那契数

题目:

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

F(0) = 0,F(1) = 1

F(n) = F(n - 1) + F(n - 2),其中 n > 1

给定 n ,请计算 F(n)

思路:

由于是dp训练,所以不能直接递归或套公式。

递推公式题目有,直接dp,没有优化空间复杂度。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution {
public:
int fib(int n) {
if(n <= 1) return n;
vector<int> dp(n + 1);
dp[0] = 0;
dp[1] = 1;
for(int i = 2;i <= n;i++) {
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
}
};

70. 爬楼梯

题目:

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

思路:

  1. 只有45个数,打表🤓
  2. 直接dp!
  3. 套斐波那契公式🤓

dp递归公式如下:

\[ dp[n]=\begin{cases} 1, & \text {$n=1$} \\ 2, & \text {$n=2$} \\ dp[n-1]+dp[n-2], & \text {$n>3$} \end{cases} \]

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution {
public:
int climbStairs(int n) {
if(n <= 2) return n;
vector<int> dp(n + 1);
dp[1] = 1;
dp[2] = 2;
for(int i = 3;i <= n;i++) {
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
}
};

746. 使用最小花费爬楼梯

题目:

给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。

你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。

请你计算并返回达到楼梯顶部的最低花费。

思路:

直接dp!递推公式如下:

\[ dp[n]=\begin{cases} 0, & \text {$n = 1 or 0$} \\ min(dp[n-1]+cost[n-1], dp[n-2]+cost[n-2]), & \text {$n>1$} \end{cases} \]

没有优化空间复杂度,感觉可有可无,优化也不复杂,具体优化方法见代码随想录 | 使用最小花费爬楼梯

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution {
public:
int minCostClimbingStairs(vector<int>& cost) {
if(cost.size() <= 2) return min(cost[0], cost[1]);
vector<int> dp(cost.size() + 1);
dp[0] = 0;
dp[1] = 0;
for(int i = 2;i <= cost.size();i++) {
dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);
}
return dp[cost.size()];
}
};

leetcode_day35
https://novelyear.github.io/2024/07/03/leetcode-day35/
作者
Leoo Yann
更新于
2024年7月3日
许可协议