70. 爬楼梯


70. 爬楼梯

难度简单 1285
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
示例 1:
输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。

  1. 1 阶 + 1 阶
  2. 2 阶
    示例 2:
    输入: 3
    输出: 3
    解释: 有三种方法可以爬到楼顶。
  3. 1 阶 + 1 阶 + 1 阶
  4. 1 阶 + 2 阶
  5. 2 阶 + 1 阶
class Solution {
    public int climbStairs1(int n) {
        if(n==1){
            return 1;
        }
        else if(n==2){
            return 2;
        }else{
            return climbStairs(n-1)+climbStairs(n-2);//n=45超时
        }
    }
    //优化 https://leetcode-cn.com/problems/climbing-stairs/solution/hua-jie-suan-fa-70-pa-lou-ti-by-guanpengchn/
    /*
     * 动态规划 ok
     */
    public int climbStairs(int n) {
        int[] dp = new int[n+1];
        dp[0]=1;//由dp[2]推导出来的。
        dp[1]=1;
        for(int i=2;i<=n;i++)&#123;
            dp[i]=dp[i-1]+dp[i-2];
        &#125;
        return dp[n];
    &#125;
&#125;
    //借鉴 org 滑动窗口
    public int climbStairs3(int n) &#123;
        int p=0,q=0,r=1;
        for(int i=1;i<=n;i++)&#123;
            p=q;
            q=r;
            r=p+q;
        &#125;
        return r;
    &#125;

动态规划
本问题其实常规解法可以分成多个子问题,爬第 n 阶楼梯的方法数量,等于 2 部分之和

爬上 n−1 阶楼梯的方法数量。因为再爬 1 阶就能到第 n 阶
爬上 n−2 阶楼梯的方法数量,因为再爬 2 阶就能到第 n 阶
所以我们得到公式 dp[n]=dp[n−1]+dp[n−2]
同时需要初始化
dp[0]=1
dp[1]=1
时间复杂度:
O(n)

    //优化 https://leetcode-cn.com/problems/climbing-stairs/solution/hua-jie-suan-fa-70-pa-lou-ti-by-guanpengchn/
    /* 解法1 递归超时,需要保存前面的值就ok
     * 动态规划
     */
    public int climbStairs(int n) &#123;
        int[] dp = new int[n+1];
        dp[0]=1;//由dp[2]推导出来的。
        dp[1]=1;
        for(int i=2;i<=n;i++)&#123;
            dp[i]=dp[i-1]+dp[i-2];
        &#125;
        return dp[n];
    &#125;

文章作者:   future
版权声明:   本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 future !
 上一篇
19. 删除链表的倒数第N个节点 19. 删除链表的倒数第N个节点
19. 删除链表的倒数第 N 个节点难度中等 1064给定一个链表,删除链表的倒数第 n *个节点,并且返回链表的头结点。*示例:**给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个
2020-10-19 future
下一篇 
剑指 Offer 15.二进制中1的个数 剑指 Offer 15.二进制中1的个数
剑指 Offer 15. 二进制中 1 的个数难度简单 62请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数。例如,把 9  表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。示例 1:输入:0
2020-10-17 future
  目录