509. 斐波那契数
斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:
F(0) = 0,F(1) = 1
F(n) = F(n - 1) + F(n - 2),其中 n > 1
给定 n ,请计算 F(n) 。来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/fibonacci-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
public int fib(int n) {
if(n==0 || n==1){
return n;
}
return fib(n-1)+fib(n-2);
}
}
70. 爬楼梯
假设你正在爬楼梯。需要
n
阶你才能到达楼顶。每次你可以爬
1
或2
个台阶。你有多少种不同的方法可以爬到楼顶呢?
class Solution {
int[] dp;
public int climbStairs(int n) {
if(n<=2){
return n;
}
dp = new int[n];
dp[n-1] = 1;
dp[n-2] = 2;
helper(0);
return dp[0];
}
private int helper(int step){
if(dp[step]!=0){
return dp[step];
}
dp[step] = helper(step+1)+helper(step+2);
return dp[step];
}
}
倒数第一个 只有一种方法到 顶层; 倒数第二个只有两种方法到顶层。
746. 使用最小花费爬楼梯
给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。
你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。
请你计算并返回达到楼梯顶部的最低花费。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/min-cost-climbing-stairs
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
int [] dp;
public int minCostClimbingStairs(int[] cost) {
int n =cost.length;
// 这个数组记录的从ith step开始最低花费
dp = new int[n];
Arrays.fill(dp,-1);
dp[n-1] = cost[n-1];
dp[n-2] = cost[n-2];
helper(0,cost);
return Math.min(dp[0],dp[1]);
}
private int helper(int step,int[] cost){
if(dp[step]!=-1){
return dp[step];
}
dp[step] = cost[step]+Math.min(helper(step+1, cost),helper(step+2,cost));
return dp[step];
}
}
思路:倒数第一个到顶点最低花费就是cost[n-1];倒数第二个到顶点的最低花费就是cost[n-2]
然后 用dp数组来储存从i到顶点的花费,算术逻辑就是cost[i] + 最小值(走一步,走两步)
最后返回从0开始走或者从1开始走的最少花费