LeetCode70:爬楼梯

2024-05-08 20:44
文章标签 爬楼梯 leetcode70

本文主要是介绍LeetCode70:爬楼梯,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目描述

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

在这里插入图片描述
解题思想
1.确定dp数组以及下标的含义
dp[i]: 爬到第i层楼梯,有dp[i]种方法

2.确定递推公式
从dp[i]的定义可以看出,dp[i] 可以有两个方向推出来。
首先是dp[i - 1],上i-1层楼梯,有dp[i - 1]种方法,那么再一步跳一个台阶不就是dp[i]了么。
还有就是dp[i - 2],上i-2层楼梯,有dp[i - 2]种方法,那么再一步跳两个台阶不就是dp[i]了么。
那么dp[i]就是 dp[i - 1]与dp[i - 2]之和!
所以dp[i] = dp[i - 1] + dp[i - 2] 。

3.dp数组如何初始化
再回顾一下dp[i]的定义:爬到第i层楼梯,有dp[i]种方法。
dp[0] = 0, dp[1] = 1, dp[2] = 2

4.确定遍历顺序
从递推公式dp[i] = dp[i - 1] + dp[i - 2];中可以看出,遍历顺序一定是从前向后遍历的

代码

class Solution {
public:int climbStairs(int n) {/*dp[i]:达到第i阶有dp[i]种方法递推公式:dp[i] = dp[i-1]+dp[i-2]初始化:dp[0] = 0,dp[1] = 1,dp[2] = 2确定遍历顺序:从前向后*/vector<int> dp(n + 1);dp[1] = 1, dp[2] = 2;for (int i = 3; i <= n; i++) {dp[i] = dp[i-1] + dp[i-2];}return dp[n];}
};

优化

class Solution {
public:int climbStairs(int n) {if (n <= 2) return n;/*dp[i]:达到第i阶有dp[i]种方法递推公式:dp[i] = dp[i-1]+dp[i-2]初始化:dp[0] = 0,dp[1] = 1,dp[2] = 2确定遍历顺序:从前向后*/int dp[3];dp[0] = 0, dp[1] = 1, dp[2] = 2;for (int i = 3; i <= n; i++) {dp[0] = dp[1];dp[1] = dp[2];dp[2] = dp[0] + dp[1];}return dp[2];}
};

这篇关于LeetCode70:爬楼梯的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/971387

相关文章

代码随想录训练营day37|52. 携带研究材料,518.零钱兑换II,377. 组合总和 Ⅳ,70. 爬楼梯

52. 携带研究材料 这是一个完全背包问题,就是每个物品可以无限放。 在一维滚动数组的时候规定了遍历顺序是要从后往前的,就是因为不能多次放物体。 所以这里能多次放物体只需要把遍历顺序改改就好了 # include<iostream># include<vector>using namespace std;int main(){int n,m;cin>>n>>m;std::vector<i

代码随想录算法训练营Day37|完全背包问题、518.零钱兑换II、377. 组合总和 Ⅳ、70. 爬楼梯(进阶版)

完全背包问题                  和01背包最大区别就是一个物品可以重复放多次,因此遍历空间时可以从前往后。 import java.util.*;public class Main{public static void main (String[] args) {Scanner sc = new Scanner(System.in);int m = sc.nextInt

每日一练5:最小花费爬楼梯(含链接)

1.链接 最小花费爬楼梯_牛客题霸_牛客网 2.题目 3.代码 class Solution {public:int minCostClimbingStairs(vector<int>& cost) {vector<int> dp(cost.size() + 1);dp[0] = 0;dp[1] = 0;for(int i = 2; i <= cost.size() ; i++){d

爬楼梯[简单]

优质博文:IT-BLOG-CN 题目 假设你正在爬楼梯。需要n阶你才能到达楼顶。 每次你可以爬1或2个台阶。你有多少种不同的方法可以爬到楼顶呢? 示例 1: 输入:n = 2 输出:2 解释:有两种方法可以爬到楼顶。 1阶 + 1阶2阶 示例 2: 输入:n = 3 输出:3 解释:有三种方法可以爬到楼顶。 1 阶 + 1 阶 + 1 阶1 阶 + 2 阶2 阶 + 1 阶 1

leetcode746:最小花费爬楼梯

最小花费爬楼梯 给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。 你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。 请你计算并返回达到楼梯顶部的最低花费。 public int minCostClimbingStairs(int[] cost) {int[] dp = new int[

【hot100篇-python刷题记录】【爬楼梯】

R5-真正的动态规划 动态规划核心: 第i步是怎么来的(即动态规划公式) 走到第i步阶梯的总方法数=sum(走到第i-1步阶梯的总方法数,走到第i-2步阶梯的总方法数)   class Solution:def climbStairs(self, n: int) -> int:if n<=2:return nsums=[0]*nsums[0],sums[1]=1,2for i in

动态规划DP--斐波那契数、爬楼梯、使用最小花费爬楼梯等示例代码

动态规划DP 文章目录 动态规划DP509. 斐波那契数70. 爬楼梯746. 使用最小花费爬楼梯62. 不同路径63. 不同路径II343.整数拆分 509. 斐波那契数 509. 斐波那契数 斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是: F(0) = 0,F(1) =

【代码随想录算法训练营第四十三天|卡码网52.携带研究材料、18.零钱兑换II、377.组合总和Ⅳ、卡码网57.爬楼梯】

文章目录 卡码网52.携带研究材料518.零钱兑换II377.组合总和Ⅳ卡码网57.爬楼梯 卡码网52.携带研究材料 这题是完全背包问题,完全背包问题在01背包问题的基础上其实主要是三个不同,第一个是初始化的时候不能再和01背包一样对第一个物品让背包大小大于物品重量的时候全部初始化为物品价值,因为现在的物品可以无限放。第二个就是动态规划内部的循环推导的时候不用倒序而是正序了,因为

代码随想录算法训练营第四十三天 | 完全背包理论基础、518.零钱兑换II、377. 组合总和 Ⅳ、70. 爬楼梯 (进阶)

完全背包理论基础 题目链接:https://kamacoder.com/problempage.php?pid=1052 文档讲解:https://programmercarl.com/%E8%83%8C%E5%8C%85%E9%97%AE%E9%A2%98%E7%90%86%E8%AE%BA%E5%9F… 视频讲解:https://www.bilibili.com/video/BV1uK41

算法训练 | 动态规划Part5 | 518.零钱兑换 II、377.组合总和 Ⅳ 、70.爬楼梯 (进阶)

目录 518. 零钱兑换 II 动态规划法 377. 组合总和 Ⅳ 动态规划法 70. 爬楼梯 (进阶) 动态规划法 518. 零钱兑换 II 题目链接:518. 零钱兑换 II - 力扣(LeetCode) 文章讲解:代码随想录 动态规划法 完全背包:01背包内嵌的循环是从大到小遍历,为了保证每个物品仅被添加一次。而完全背包的物品是可以添加多次的,所以要从小