509. 斐波那契数
思路:
n位置的数=n-1位置+n-2位置
代码:
class Solution {
public int fib(int n) {
if(n < 2) return n;
//dp数组含义:第i个数是dp[i]
int[] dp = new int[n + 1];//从0开始,所以创建数组是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. 爬楼梯
思路:
每次只能爬1阶或2阶,所以到n阶只能从n-1阶和n-2阶到达,其方法数=到达前面两阶方法数的和。
代码:
class Solution {
public int climbStairs(int n) {
int[] dp = new int[n + 1];//从0开始爬
//初始化,n=0初始化为1,为了得出n=2的方法数
dp[0] = 1;
dp[1] = 1;
//爬到i阶的方法数=i-1阶方法数(再爬一阶)+i-2阶方法数(再爬两阶)
for(int i = 2; i <= n; i++){
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
}
}
需要注意的点:
1、dp[0]=1对题目没有实际意义,只是为了初始化2位置的方法数。
2、如果初始化dp[1]和dp[2],则在n=1时数组会超出下标。
746. 使用最小花费爬楼梯
思路:
每次可以走1或2步,所以需要取(到达上一步的花费+上一步出发cost)和(到达上两步的花费+上两步出发cost)的最小值
代码:
class Solution {
public int minCostClimbingStairs(int[] cost) {
//爬到楼顶是超过下标n,所以要花费的长度+1
int[] dp = new int[cost.length + 1];
//呆在0、1阶不需要花费
dp[0] = 0;
dp[1] = 0;
for(int i = 2; i < dp.length; i++){
dp[i] = Math.min(dp[i - 2] + cost[i - 2], dp[i -1] + cost[i - 1]);
}
return dp[dp.length - 1];
}
}
需要注意的点:
1、建立dp数组的长度要根据题目含义来,见注释。
2、初始化根据题目描述来。