509. 斐波那契数
思路:dp[i] = dp[i - 1] + dp[i - 2]
只要初始化dp[0]和dp[1]即可
因为可以只维护两个遍历即可,所以设置一个中间变量是可以的,并更新即可
for循环中i从i=2开始,就是因为dp[i] = dp[i - 1] + dp[i - 2]表达式
代码:
class Solution {
public int fib(int n) {
if(n<2){
return n;
}
int a=0,b=1,c=0;
for(int i=2;i<=n;i++){
c=a+b;
a=b;
b=c;
}
return c;
}
}
//常规方式
class Solution {
public int fib(int n) {
if (n <= 1) return n;
int[] dp = new int[n + 1];
dp[0] = 0;
dp[1] = 1;
for (int index = 2; index <= n; index++){
dp[index] = dp[index - 1] + dp[index - 2];
}
return dp[n];
}
}
70. 爬楼梯
思路:站在第0层,就是楼顶,所以不考虑dp[0]的初始化
从dp[1],dp[2]开始递推,i从3开始
思路其实和斐波那契差不多
因为是从dp[1],dp[2]开始初始化,所以n<=2时,返回n
而斐波那契是从dp[0] dp[1]开始初始化,所以n<2时,返回n
代码:
class Solution {
public int climbStairs(int n) {
if(n<=2){
return n;
}
int a=1,b=2,c=0;
for(int i=3;i<=n;i++){
c=a+b;
a=b;
b=c;
}
return c;
}
}
// 常规方式
public int climbStairs(int n) {
int[] dp = new int[n + 1];
dp[0] = 1;
dp[1] = 1;
for (int i = 2; i <= n; i++) {
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
}
746. 使用最小花费爬楼梯
思路:因为由题目知道:第一步是不用花费的。
dp[i]表示上到当前第i个台阶的花费
dp[i]=Math.min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]);
这里初始化dp[0],dp[1],赋值都为0,因为由题目知道第一步不花费,所以第1和第2台阶的都是0
即dp[0]=0,dp[1]=0;
这里因为最后要走到最后一个台阶,所以得到len的位置
代码:
class Solution {
public int minCostClimbingStairs(int[] cost) {
int len=cost.length;
int[] dp=new int[len+1];
dp[0]=0;
dp[1]=0;
for(int i=2;i<=len;i++){
dp[i]=Math.min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]);
}
return dp[len];
}
}