一、题目打卡
1.1 斐波那契数列
题目链接:. - 力扣(LeetCode)
// class Solution {
// public:
// int fib(int n) {
// if(n == 0) return 0;
// vector<int> dp(n + 1);
// dp[0] = 0;
// dp[1] = 1;
// for(int i = 2 ; i < n + 1;i++){
// dp[i] = dp[i - 1] + dp[i - 2];
// }
// // for(auto& it : dp){
// // cout << it<<" ";
// // }
// return dp[n];
// }
// };class Solution {
public:int fib(int n) {if(n == 0) return 0;int dp[2];dp[0] = 0;dp[1] = 1;while(n--){int tmp = dp[1];dp[1] = dp[1] + dp[0];dp[0] = tmp;}return dp[0];}
};
题目本身把初始化和递推公式都给出了,所以题目不难,需要注意的是初始化的数值,还有索引和对应数列的处理,因为这样的输出方式,是加了一个前缀 0 的,所以最终遍历和最终返回的时候需要考虑到这一点,等于是步长要向后移动一个单位。
1.2 爬楼梯(答案思路)
题目链接:. - 力扣(LeetCode)
class Solution {
public:int climbStairs(int n) {if(n <= 2) return n;vector<int> dp(n + 1); // 这里我之前没有想到的一个是存储的是到这一层所存储的数量,一开始想的是步数的累加dp[0] = 0;dp[1] = 1;dp[2] = 2;for(int i = 3; i < n + 1;i++){dp[i] = dp[i - 1] + dp[i - 2];}return dp[n];}
};
这个题目在自己定义状态变量的时候想错了,如果定义状态变量是积累的步数的话,这样其实是走不通的,因为还需要考虑每一步怎么走,但是多写几个会发现,其实这个累加的过程还是有规律的,比如说到 3 的方法,其实就是到 2 的方法总数加上到 1 的方法总数,因为这两个位置都只需要一步就走到 3 了,也就是说只需要在之前的方法中,尾部只会有一种选择,因而直接两者相加就可以了。
1.3 使用最小花费爬楼梯
题目链接:. - 力扣(LeetCode)
class Solution {
public:int minCostClimbingStairs(vector<int>& cost) {// if(cost.size() < 2) return 0;vector<int> dp(cost.size() + 1,0);// dp[0] = 0;// dp[1] = 0;for(int i = 2 ; i < cost.size() + 1; i++){// if(i == 7) cout << cost[i -1] << " " << cost[i-2] << " " << dp[i - 1] << " " << dp[i-2] <<endl;// if(i == 7) cout << min(cost[i - 1], cost[i - 2]) + min(dp[i-1],dp[i-2]) << endl;dp[i] = min(cost[i - 1] + dp[i - 1], dp[i - 2] + cost[i - 2]);// dp[i] = min(cost[i - 1], cost[i - 2]) + min(dp[i-1],dp[i-2]);}// for(auto& it: dp){// cout << it << endl;// }return dp[cost.size()];}
};
感觉有了前面题的思路,这个状态转移的方法不是很难理解,不过对我来说复杂一点的其实还是怎么去处理这个索引。