前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode-70-爬楼梯

LeetCode-70-爬楼梯

作者头像
benym
发布2022-07-14 16:18:49
1710
发布2022-07-14 16:18:49
举报
文章被收录于专栏:后端知识体系

# LeetCode-70-爬楼梯

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

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

**注意:**给定 n 是一个正整数。

示例 1:

代码语言:javascript
复制
输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
1.  1 阶 + 1 阶
2.  2 阶

示例 2:

代码语言:javascript
复制
输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
1.  1 阶 + 1 阶 + 1 阶
2.  1 阶 + 2 阶
3.  2 阶 + 1 阶

# 解题思路

方法1、动态规划:

当n等于1的时候,只需要跳一次即可,只有一种跳法,记f(1)=1

当n等于2的时候,可以先跳一级再跳一级,或者直接跳二级,共有2种跳法,记f(2)=2

当n等于3的时候,他可以从一级台阶上跳两步上来,也可以从二级台阶上跳一步上来,所以总共有f(3)=f(2)+f(1);

所以当等于n(n>2)的时候,总共有f(n)=f(n-1)+f(n-2)种跳法

此时的状态: 为n的时候,可能的跳法有多少种

状态转移方程:f(n)=f(n-1)+f(n-2)

方法2、优化的动态规划:

上一个方法需要开辟一个n的数组,其实可以直接用双指针完成状态的转移,不再需要开辟多余的空间

# Java代码

代码语言:javascript
复制
class Solution {
    public int climbStairs(int n) {
        if (n <= 1)
            return 1;
        int[] dp = new int[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];
    }
}

# Java代码2

代码语言:javascript
复制
class Solution {
    public int climbStairs(int n) {
        int[] result = new int[]{1, 1};
        if (n < 2) {
            return result[n];
        }
        int sum = 0;
        int f1 = 1;
        int f2 = 1;
        for (int i = 2; i <= n; i++) {
            sum = (f1 + f2);
            f1 = f2;
            f2 = sum;
        }
        return sum;
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-06-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • # LeetCode-70-爬楼梯
    • # 解题思路
      • # Java代码
        • # Java代码2
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档