力扣题目链接
class Solution {
public:
int fib(int N) {
if (N <= 1) return N;
vector 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];
}
};
class Solution {
public:
int fib(int n) {
if (n == 0) return 0;
if (n == 1) return 1;
int f0 = 0, f1 = 1, f2;
for (int i = 2; i <= n; i++){
f2 = f0 + f1;
f0 = f1;
f1 = f2;
}
return f2;
}
};
O(n)
O(1)
class Solution {
public:
int fib(int n) {
if (n == 0) return 0;
else if (n == 1) return 1;
else return fib(n - 1) + fib(n - 2);
}
};
class Solution {
public:
int fib(int n) {
if (n < 2) return n;
vector> q{{1, 1}, {1, 0}};
vector> res = matrix_pow(q, n - 1);
return res[0][0];
}
vector> matrix_pow(vector>& a, int n) {
vector> ret{{1, 0}, {0, 1}}; // 单位矩阵
while (n > 0) {
if (n & 1) {
ret = matrix_multiply(ret, a);
}
n >>= 1;
a = matrix_multiply(a, a);
}
return ret;
}
vector> matrix_multiply(vector>& a, vector>& b) {
vector> c{{0, 0}, {0, 0}};
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 2; j++) {
c[i][j] = a[i][0] * b[0][j] + a[i][1] * b[1][j];
}
}
return c;
}
};
O(logn)
O(1)
class Solution {
public int fib(int n) {
double sqrt5 = Math.sqrt(5);
double fibN = Math.pow((1 + sqrt5) / 2, n) - Math.pow((1 - sqrt5) / 2, n);
return (int) Math.round(fibN / sqrt5);
}
}
力扣题目链接
动态规划常规解法可以分成多个子问题,爬第n阶楼梯的方法数量,等于2部分之和
class Solution {
public:
int climbStairs(int n) {
if (n == 1) return 1;
int dp[4];
dp[1] = 1;
dp[2] = 2;
for (int i = 3; i <= n; i++) {
dp[3] = dp[2] + dp[1];
dp[1] = dp[2];
dp[2] = dp[3];
}
return dp[2];
}
};
O(n)
O(1)
力扣题目链接
dp[i] 表示走到第i阶楼梯的最小花费
递推公式:dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);
初始化:dp[0] =0; dp[1] = 0; 到达第0阶和第1阶不需要耗费体力,往上跳会耗费体力
遍历顺序:从前往后
class Solution {
public:
/*
* dp[i]表示走到第i阶楼梯的最小花费
* 递推公式:dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);
* 初始化:dp[0] = cost[0]; dp[1] = 0;
* 遍历顺序:从前往后
*/
int minCostClimbingStairs(vector& cost) {
vector 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()];
}
};
O(n)
O(n)
class Solution {
public:
/*
* dp[i]表示走到第i阶楼梯的最小花费
* 递推公式:dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);
* 初始化:dp[0] = 0; dp[1] = 0;
* 遍历顺序:从前往后
*/
int minCostClimbingStairs(vector& cost) {
int dp0 = 0;
int dp1 = 0;
for (int i=2; i <= cost.size(); i++) {
int dp2 = min(dp1 + cost[i - 1], dp0 + cost[i - 2]);
dp0 = dp1;
dp1 = dp2;
}
return dp1;
}
};
O(n)
O(1)