代码随想录算法训练营day 38 |509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯

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、初始化根据题目描述来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值