代码随想录第三十八天|斐波那契数、爬楼梯、最小花费爬楼梯

Leetcode 509. 斐波那契数

题目链接: 斐波那契数
自己的思路:递归,只会递归,但是复杂度太高了!!

代码:

class Solution {
    public int fib(int n) {
        if (n==0||n==1) return n;
        return fib(n-1)+fib(n-2);
    }
}

正确思路:动态规划。动规五部曲:1、首先要分析动态规划dp数组的含义,这道题应该是一个一维数组dp[i],dp[i]表示第i个数的斐波那契数;2、递推公式,这道题已经给了我们递推公式dp[i]=dp[i-1]+dp[i-2];3、递归数组的初始化,dp[0]=0,dp[1]=1;4、遍历顺序,因为是求第n个斐波那契数,所以遍历顺序是从左到右;5、打印dp数组,主要是用于debug,来观察自己的想法和真实的是否一样!!!

代码:

class Solution {
    public int fib(int n) {
        if (n==0||n==1) return n;
        //dp数组
        int[] dp = new int[n+1];
        //dp数组初始化
        dp[0]=0;
        dp[1]=1;
        for (int i =2;i<=n;i++){
            //递推公式
            dp[i]=dp[i-1]+dp[i-2];
        }
        return dp[n];
    }
}

简化:由于这个题,当前的斐波那契数只和前面两个数有关,所以我们可以选择使用三个变量来代替dp数组即可,一直交替赋值向前。

代码:

class Solution {
    public int fib(int n) {
        if (n==0||n==1) return n;
        //初始化三个数
        int a = 0;
        int b = 1;
        int sum = 0;
        for (int i =2;i<=n;i++){
            sum = a+b;
            a = b;
            b = sum;
        }
        return sum;
    }
}

Leetcode 70. 爬楼梯

题目链接: 爬楼梯
自己的思路:仔细分析其实和斐波那契数列一样;比如说上第n条台阶,那么我可以先上第n-1阶,再走一步就可以上第n条台阶,也可以先上第n-2阶,然后再走两步就可以上第n条台阶,所以上第n条台阶所可能的情况就是上第n-2条台阶的情况加上上第n-1条台阶的情况;所以动态规划五部曲:1、dp数组的含义:表示上第n条台阶有多少种可能情况;2、递推公式:根据分析dp[i]=dp[i-1]+dp[i-2];3、dp数组初始化:初始化上第0条台阶有1种情况,上第1条台阶有一种情况;4、遍历顺序:可以看出和斐波那契数一样是从前向后遍历;5、打印dp数组:主要是用于debug的情况下!!!所以我们这个题也采用三个变量的方式来处理!!!

正确思路:

代码:

class Solution {
    public int climbStairs(int n) {
        int a = 1;
        int b = 1;
        //第一条台阶的情况
        int sum = 1;
        for (int i =2;i<=n;i++){
            sum = a+b;
            a = b;
            b = sum;
        }
        return sum;
    }
}

Leetcode 746. 使用最小花费爬楼梯

题目链接: 使用最小花费爬楼梯
自己的思路:没想出来怎么去表示最小的花费,其实和前面两道题还挺像的!!!

正确思路:这道题是让我们找上第n条台阶的最小花费,我们可以在上一题的基础上进行思考,当我们要让第n条台阶的时候,可以通过第n-1条台阶走一步上来,也可以通过第n-2条台阶走两步上来,那么既然我们要求上第n条台阶的花费的最小值,题目还说如果要向上走就要有对应的花费,所以我们上第n条台阶的最小值=min(上第n-1条台阶的最小值+cost[n-1],上第n-2条台阶的最小值+cos[n-2]),所以我们就可以推导出递推公式来。动态规划五部曲:1、dp数组的含义:dp[i]表示上第i条台阶的最小花费;2、递推公式:dp[i]=min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]);3、dp数组初始化:从题意可知,我们在第0条台阶或者第1条台阶的时候,我们都是不需要花费的,所以dp[0]和dp[1]都为0;4、遍历顺序:因为是求第n条台阶的最小花费,所以我们的遍历顺序应该是从左向右进行遍历;5、打印dp数组:主要用于对dp数组的debug!!!!我们还是使用三个变量来模拟dp数组,因为dp数组只和前面两个数相关!!!!

代码:

class Solution {
    public int minCostClimbingStairs(int[] cost) {
        int a = 0;
        int b = 0;
        int sum = 0;
        for (int i = 2;i<=cost.length;i++){
            //找上第i个台阶所需要的最小花费
            sum = Math.min(a+cost[i-2],b+cost[i-1]);
            a = b;
            b = sum;
        }
        return sum;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值